마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

네이버 clova 얼굴인식 api를 통해 표정인식을 구현하려 하는데, 아예 api 소스로 진입하지 못합니다ㅠㅠ 왜 안되는지 봐주세요..!

0 추천

네이버 clova 얼굴인식 api를 통해 표정인식을 구현하려고 하는데, 

api 소스코드에서 아예 try 부분으로 들어가지도 못합니다. ㅠㅠ

Logcat에서의 에러는 아래와 같이 뜹니다. 

System.out: (HTTPLog)-Static: isSBSettingEnabled false
    (HTTPLog)-Static: isSBSettingEnabled false
System.out: android.os.NetworkOnMainThreadException

어느 부분이 틀린지 감도 안잡혀서 전체 mainactivity 코드와 로그캣에서의 에러를 다 올립니다 ㅠㅠ 

혹시나 표정인식을 구현해보신 분이 있다면 알려주시면 정말정말 감사합니다ㅠㅠ

package com.example.leeyoubin.knockknock;

import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;


public class MainActivity extends AppCompatActivity {
    Button face;
    Button recog;
    ImageView iv;

    private Uri photoUri;
    private String filePath;
    String imgFile;

    String currentPhotoPath;
    String fileName;//이미지 이름
    private static final int REQUEST_IMAGE_CAPTURE = 672;
    Intent data;
    private String imageFilePath;
    Intent intent;
    private int REQUEST_TEST = 1;
    TextView emotion;

    final String clientId = "03fyTLwrHV5l0ABjQaCW";//애플리케이션 클라이언트 아이디값";
    final String clientSecret = "W134QS_Tw9";//애플리케이션 클라이언트 시크릿값";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button face = findViewById(R.id.face);
        Button recog = findViewById(R.id.recog);
        ImageView iv = findViewById(R.id.iv);



        final TextView emotion = findViewById(R.id.emotion);
        StringBuffer reqStr = new StringBuffer();

        face.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendTakePhotoIntent();
            }

        });
        recog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                try {

                    String paramName = "image"; // 파라미터명은 image로 지정
                    String imgFile = currentPhotoPath;
                    File uploadFile = new File(imgFile);
                    String apiURL = "https://openapi.naver.com/v1/vision/face"; // 얼굴 감지
                    URL url = new URL(apiURL);
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    con.setUseCaches(false);
                    con.setDoOutput(true);
                    con.setDoInput(true);
                    // multipart request
                    String boundary = "---" + System.currentTimeMillis() + "---";
                    con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
                    con.setRequestProperty("X-Naver-Client-Id", clientId);
                    con.setRequestProperty("X-Naver-Client-Secret", clientSecret);
                    OutputStream outputStream = con.getOutputStream();
                    PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
                    String LINE_FEED = "\r\n";
                    // file 추가
                    String fileName = uploadFile.getName();
                    writer.append("--" + boundary).append(LINE_FEED);
                    writer.append("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + fileName + "\"").append(LINE_FEED);
                    writer.append("Content-Type: "  + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
                    writer.append(LINE_FEED);
                    writer.flush();
                    FileInputStream inputStream = new FileInputStream(uploadFile);
                    byte[] buffer = new byte[4096];
                    int bytesRead = -1;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                    outputStream.flush();
                    inputStream.close();
                    writer.append(LINE_FEED).flush();
                    writer.append("--" + boundary + "--").append(LINE_FEED);
                    writer.close();
                    BufferedReader br = null;
                    int responseCode = con.getResponseCode();
                    if(responseCode==200) { // 정상 호출
                        br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    } else {  // 에러 발생
                        System.out.println("error!!!!!!! responseCode= " + responseCode);
                        br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    }
                    String inputLine;
                    if(br != null) {
                        StringBuffer response = new StringBuffer();
                        while ((inputLine = br.readLine()) != null) {
                            response.append(inputLine);
                        }
                        br.close();
                        System.out.println(response.toString());
                        emotion.setText(response.toString());
                    } else {
                        System.out.println("error !!!");
                        emotion.setText("error !!!");
                    }
                } catch (Exception e) {
                    System.out.println(e);
                    emotion.setText(e.toString());
                }
            }
        });
    }





    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            ((ImageView) findViewById(R.id.iv)).setImageURI(photoUri);
        }
    }

    private void sendTakePhotoIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
            }

            if (photoFile != null) {
                photoUri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
            }

        }
    }


    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp;
        timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

}


 

익명사용자 님이 2019년 5월 16일 질문

1개의 답변

0 추천

통신 같은 작업은 서버에서 응답이 언제 올지  모르며,

응답이 늦을 경우  응답을 기다리느라, UI처리가 안되는 문제가 있어,  

메인 UI Thread에서 통신을 사용하면 NetworkOnMainThreadException를 발생 시킵니다.

AsyncTask 같은 걸 추가해서 거기서 통신 로직을 수행하게 변경 하세요.

https://lovemewithoutall.github.io/it/networkOnMainThreadException/

 

 

익명사용자 님이 2019년 5월 16일 답변
버튼 누를때 작동하게 하는데도, 트라이 위에 asyncTask 추가만 하면 될끼요..?!
...