2017-12-30 23 views
0

얼굴을 감지하기 위해 google cloud vision API을 사용하고있는 Android 애플리케이션을 구축하려고합니다. 자습서는 this입니다. 가상 방법 'com.google.api.services를 호출 할Google Cloud Vision API에 null 객체 참조가 표시됨

시도 : 문제는 내가 버튼을 클릭 한 후 화면에 표시하기로했다 toast message하지만 logcat 쇼를 생성 할 수없는 나는,이다

MainActivity.java : 널 객체 참조 여기

에 .vision.v1.Vision $ 이미지 com.google.api.services.vision.v1.Vision.images는()의 코드이며

public class MainActivity extends AppCompatActivity { 

private Button upload_button; 
private ImageView image_capture; 
final int CAMERA_PIC_REQUEST = 100; 

private Vision vision; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    upload_button = (Button) findViewById(R.id.uploadb); 
    image_capture=(ImageView)findViewById(R.id.capturedImage); 

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{android.Manifest.permission.CAMERA}, 
        5); 
     } 
    } 

    Vision.Builder visionBuilder = new Vision.Builder(
      new NetHttpTransport(), 
      new AndroidJsonFactory(), 
      null); 

    visionBuilder.setVisionRequestInitializer(
      new VisionRequestInitializer("AIzaSyAueQjrrY_GiXh7kNGlbDLKWhYP-4q77vI")); 
    Vision vision = visionBuilder.build(); 

    upload_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      /*Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);*/ 
      imageDectection(); 
     } 
    }); 
} 

private void imageDectection() { 
    AsyncTask.execute(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       InputStream inputStream = getResources().openRawResource(R.raw.crewf); 
       byte[] photoData = IOUtils.toByteArray(inputStream); 

       Image inputImage = new Image(); 
       inputImage.encodeContent(photoData); 

       Feature desiredFeature = new Feature(); 
       desiredFeature.setType("FACE_DETECTION"); 

       AnnotateImageRequest request = new AnnotateImageRequest(); 
       request.setImage(inputImage); 
       request.setFeatures(Arrays.asList(desiredFeature)); 

       BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest(); 
       batchRequest.setRequests(Arrays.asList(request)); 

       BatchAnnotateImagesResponse batchResponse = 
         vision.images().annotate(batchRequest).execute(); 

       List<FaceAnnotation> faces = batchResponse.getResponses() 
         .get(0).getFaceAnnotations(); 

       int numberOfFaces = faces.size(); 

       String likelihoods = ""; 
       for(int i=0; i<numberOfFaces; i++) { 
        likelihoods += "\n It is " + 
          faces.get(i).getJoyLikelihood() + 
          " that face " + i + " is happy"; 
       } 

       final String message = 
         "This photo has " + numberOfFaces + " faces" + likelihoods; 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           message, Toast.LENGTH_LONG).show(); 
        } 
       }); 

      } catch(Exception e) { 
       Log.d("ERROR", e.getMessage()); 
      } 
     } 
    }); 
} 
} 

그림은 /res/raw 위치에 crewf.jpg으로 저장됩니다. 유형을 LABEL_DETECTION, TEXT_DETECTION, LANDMARK_DETECTION으로 설정하려고 시도했지만 아무 것도 작동하지 않습니다.

누구든지 나를 도와 줄 수 있습니까?

답변

0

비전 개체를 초기화하지 않습니다.

당신은 두 개의 클래스 변수를 선언해야합니다

private Vision.Builder visionBuilder = new Vision.Builder(
               new NetHttpTransport(), 
               new AndroidJsonFactory(), 
               null 
      ).setVisionRequestInitializer(new VisionRequestInitializer(BuildConfig.GOOGLE_API_KEY)); 
private Vision vision; 

을 그런 다음에서 onCreate 개체를 빌드 : 그 후

vision = visionBuilder.build(); 

을, 당신은 갈 준비가 된 것입니다.

아직도 문제가 이메일을 보내고있는 중이라면 코드 검토에 도움을 드릴 수 있습니다.

관련 문제