2016-04-24 19 views
0

Momentan verwende ich Google Mobile Vision API zur Gesichtserkennung. Angenommen, die Aktivität wird nach dem Drehen des Bildschirms neu gestartet und alle Variablen werden neu initialisiert. Ich weiß jedoch nicht, warum die App nicht mehr funktioniert und zeigt NullPointerException an. Hier sind meine Codes.Android-App funktioniert nicht mehr nach Bildschirmrotation

public class MainActivity extends AppCompatActivity { 

    private ImageView mIvDetected; 
    private Bitmap mImage; 

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

     mIvDetected = (ImageView) findViewById(R.id.iv_detected); 

     //Load an image 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inMutable = true; 
     mImage = BitmapFactory.decodeResource(getResources(), R.drawable.face2); 

     //Configure FaceDetector 
     FaceDetector detector = new FaceDetector.Builder(this) 
       .setMode(FaceDetector.ACCURATE_MODE) 
       .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
       .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
       .setTrackingEnabled(false) 
       .build(); 

     if(false == detector.isOperational()){ 
      Toast.makeText(this, "Face detection service is not ready", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     //Add the image on a Frame object 
     Frame frame = new Frame.Builder().setBitmap(mImage).build(); 

     //Detect all faces from Frame object 
     SparseArray<Face> faceArray = detector.detect(frame); 

     //Do some drawing on faces 
     **Bitmap outBitmap = drawOnFace(faceArray);** 
     mIvDetected.setImageBitmap(outBitmap); 

     //Releasing the detector object 
     detector.release(); 
    } 

    /** Method to do some drawing on faces */ 
    private Bitmap drawOnFace(SparseArray<Face> faceArray){ 

     Paint mIdPaint = new Paint(); 
     mIdPaint.setColor(Color.RED); 
     mIdPaint.setTextSize(40.f); 

     Paint paint = new Paint(); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(5); 
     paint.setStyle(Paint.Style.STROKE); 

     Paint mTextPaint = new Paint(); 
     mTextPaint.setAntiAlias(true); 
     mTextPaint.setDither(true); 
     mTextPaint.setTextSize(20); 
     mTextPaint.setColor(Color.GREEN); 
     mTextPaint.setStyle(Paint.Style.FILL); 

     // Create a blank bitmap same size with the source image 
     Bitmap outBitmap = Bitmap.createBitmap(mImage.getWidth(), mImage.getHeight(), Bitmap.Config.RGB_565); 

     // Put the bitmap on canvas for drawing 
     Canvas canvas = new Canvas(outBitmap); 
     canvas.drawBitmap(mImage, 0, 0, null); 

     for(int i=0; i < faceArray.size(); i++){ 
      Face face = faceArray.get(i); 

      //Drawing rectangle on each face 
      **drawRectangle(canvas, face.getPosition(), face.getWidth(), face.getHeight());** 

      //Drawing a point on each face features 
      for(Landmark landmark : face.getLandmarks()) { 
       switch (landmark.getType()){ 
        case Landmark.LEFT_EYE: 
         drawPoint(canvas, landmark.getPosition()); 
         canvas.drawText("Left eye: " + face.getIsLeftEyeOpenProbability(), landmark.getPosition().x, landmark.getPosition().y - 30, mTextPaint); 
         break; 
        case Landmark.RIGHT_EYE: 
         drawPoint(canvas, landmark.getPosition()); 
         canvas.drawText("Right eye: " + face.getIsRightEyeOpenProbability(), landmark.getPosition().x, landmark.getPosition().y - 30, mTextPaint); 
         break; 
        case Landmark.BOTTOM_MOUTH: 
         drawPoint(canvas, landmark.getPosition()); 
         canvas.drawText("Smile: " + face.getIsSmilingProbability(), landmark.getPosition().x, landmark.getPosition().y + 40, mTextPaint); 
         break; 
        case Landmark.LEFT_MOUTH: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.RIGHT_MOUTH: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.NOSE_BASE: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.LEFT_CHEEK: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.RIGHT_CHEEK: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.LEFT_EAR: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.LEFT_EAR_TIP: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.RIGHT_EAR: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
        case Landmark.RIGHT_EAR_TIP: 
         drawPoint(canvas, landmark.getPosition()); 
         break; 
       } 
      } 

      /** Other useful details that may be of your interest */ 
      Log.d("", "FaceDetection- FaceId:" + face.getId() 
        + " Smiling:" + face.getIsSmilingProbability() 
        + " LeftEyeOpen:" + face.getIsLeftEyeOpenProbability() 
        + " RightEyeOpen:" + face.getIsRightEyeOpenProbability()); 


     } 

     return outBitmap; 
    } 

    /** This method draws a rectangle */ 
    private void drawRectangle(Canvas canvas, PointF point, float width, float height){ 
     Paint paint = new Paint(); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(5); 
     paint.setStyle(Paint.Style.STROKE); 

     float x1 = point.x; 
     float y1 = point.y; 
     float x2 = x1 + width; 
     float y2 = y1 + height; 

     RectF rect = new RectF(x1, y1, x2, y2); 
     canvas.drawRect(rect, paint); 
    } 

    /** This method draws a point with hole */ 
    private void drawPoint(Canvas canvas, PointF point){ 
     Paint paint = new Paint(); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(48); 
     paint.setStyle(Paint.Style.STROKE); 

     float x = point.x; 
     float y = point.y; 

     canvas.drawCircle(x, y, 1, paint); 
    } 
} 

Hier sind meine Fehler.

04-24 12: 59: 50,231 2865-2865/com.example.andy318.cameraone E/Android Runtime: fatal EXCEPTION: main Prozess: com.example.andy318.cameraone, PID: 2865 Java. lang.RuntimeException: Die Aktivität konnte nicht fortgesetzt werden {com.example.andy318.cameraa/com.example.andy318.cameraone.MainActivity}: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.PointF com.google.android aufzurufen .gms.vision.face.Face.getPosition() 'für eine Nullobjekt-Referenz bei android.app.ActivityThread.performResumeActivity (ActivityThread.java:3103) bei android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3134) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2481) bei android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:4077) bei android.app.ActivityThread.-wrap15 (ActivityThread.java) bei Android .app.ActivityThread $ H.handleMessage (ActivityThread.java:1350) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:148) bei android .app.ActivityThread.main (ActivityThread.java:5417) bei java.lang.reflect.Method.invoke (systemeigene Methode) bei com.android.internal.os.ZygoteInit $ Methode AndArgsCaller.run (ZygoteInit.java:726) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) verursacht durch: java.lang.NullPointerException: Versuch, virtuelle Methode 'android.graphics aufzurufen. PointF com.google.android.gms.vision.face.Face.getPosition() 'für eine Nullobjekt-Referenz bei com.example.andy318.cameraone.MainActivity.drawOnFace (MainActivity.java:106) bei com.example. andy318.cameraone.MainActivity.onResume (MainActivity.java:69) bei android.app.Instrumentation.callActivityOnResume (Instrumentation.java:1258) bei android.app.Activity.performResume (Activity.java:6312) bei android. app.ActivityThread.performResumeActivity (Acti vityThread.java:3092) bei android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3134) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2481) bei android.app.ActivityThread.handleRelaunchActivity (ActivityThread. Java: 4077) bei android.app.ActivityThread.-wrap15 (ActivityThread.java) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1350) bei android.os.Handler.dispatchMessage (Handler.java : 102) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java:5417) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.Java: 616)

Fehler treten auf

Bitmap outBitmap = drawOnFace (faceArray);

und

drawRectangle (Leinwand, face.getPosition(), face.getWidth(), face.getHeight());

die ich in die Codierung **.

Ich weiß, wo ist mein Fehler, aber ich weiß, wie man es löst. Nachdem der Bildschirm gedreht wurde, hat das SparseArray faceArray den Wert null. Ich habe versucht, zu verwenden, wenn Null-Bedingung zu überprüfen, aber es würde die Erkennung nicht zeigen. (Zeigen Sie nur das Originalbild)

+0

Mögliche Duplikat [Was ist ein Null-Zeiger-Ausnahme, und wie kann ich das beheben es?] (http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-fix-it) –

+0

Sie erhalten nur den Schlüssel, nicht die Objekt: http://stackoverflow.com/a/8006994/6247492 – user6247492

Antwort

0

java.lang.NullPointerException: Der Versuch, virtuelle Methode 'Face.getPosition()' aufrufen auf ein Null-Objekt Referenz

Ihr Gesicht Variable null ist!

http://developer.android.com/reference/android/media/FaceDetector.html

wo erkennen Sie get() aus? nvm, found it: https://developers.google.com/android/reference/com/google/android/gms/vision/face/FaceDetector.html#public-methods

Vielleicht müssen Sie das SparseArray final machen oder alle Faces im Inneren oder so ähnlich?

Verwandte Themen