2017-12-30 33 views
0

Ich versuche eine Android-Anwendung zu erstellen, wo ich google cloud vision API zum Erkennen von Gesichtern verwende. Ich folge this Tutorial. Das Problem ist, dass, ich bin nicht in der Lage, die toast message zu produzieren, die angeblich auf dem Bildschirm angezeigt werden, nachdem ich auf die Schaltfläche klicken, aber die logcat zeigt:Google Cloud Vision-API zeigt null Objektreferenz

Versuch virtuelle Methode ‚com.google.api.services aufzurufen .vision.v1.Vision $ Bilder com.google.api.services.vision.v1.Vision.images()‘auf ein null-Objekt Referenz

Hier ist der Code:

MainActivity.java

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()); 
      } 
     } 
    }); 
} 
} 

Das Bild wird in /res/raw Position als crewf.jpg gespeichert. Ich habe versucht, die Typen als LABEL_DETECTION, TEXT_DETECTION, LANDMARK_DETECTION einzustellen, aber nichts davon funktioniert.

Kann mir jemand dabei helfen?

Antwort

0

Sie initialisieren das Vision-Objekt nicht.

Sie sollten zwei Klassenvariablen deklarieren:

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

dann auf dem onCreate das Objekt bauen:

vision = visionBuilder.build(); 

Danach sind Sie bereit zu gehen.

Wenn Sie immer noch Schwierigkeiten haben, mailen Sie mir, ich könnte Ihnen helfen, Ihren Code zu überprüfen.

Verwandte Themen