2016-07-22 15 views
-2

Ich habe eine Klassenvariable photoPath, die auf Null initialisiert wird.Android Camera API - Wie wird benachrichtigt, wenn onPictureTaken() ausgeführt wurde und zurückgegeben wurde?

private static string photoPath = null; 

dann innerhalb des Körpers des onPictureTaken wird diese Variable einen bestimmten String-Wert zugewiesen.

final PictureCallback pictureCallback = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.i(TAG, "onPictureTaken() of Camera.PictureCallback called.");// check 
     ... 
     photoPath = aValidPathString; 
     ... 
    } 
} 

Dann in dem Klick-Listener auf eine Schaltfläche, habe ich die Camera.takePicture() Methode aufgerufen. Danach habe ich den Wert photoPath ausgeloggt. Dieser Wert von photoPath ergibt sich als null im Ausgang; und onPictureTaken() of Camera.PictureCallback called. wird nie in der Ausgabe gedruckt. Dies bedeutet, dass onPictureTaken() NICHT aufgerufen wird, wenn ich den Wert photoPath abmelde.

Deshalb möchte ich wissen, wann onPictureTaken() zurückgekehrt ist, so dass ich sicher sein kann, dass onPictureTaken() ausgeführt wurde, und ich den Wert von photoPath an diesem Punkt wieder auslogge. Wie mache ich das?

button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.i(TAG, "onClick() of View.OnClickListener called.");// check 

     camera.takePicture(null, null, pictureCallback); 

       /*while(photoPath==null) { 
        Log.i(TAG, "PHOTO_NAME is null at the moment.");/* 
        new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          Log.i(TAG, "Waiting for half a second."); 
         } 
        }, 500);* 
       }*/ 

     Log.i(TAG, photoPath);// check 
    } 
} 
+1

'Takepicture()' ist asynchron. Die Arbeit beginnt nicht erst mit dem Aufnehmen des Bildes, bevor "onClick()" zurückkehrt, AFAIK. Verschieben Sie Ihren Code, der den Pfad zu "onPictureTaken()" benötigt. – CommonsWare

+0

@CommonsWare Danke, das mache ich. Aber hast du meine Frage abgelehnt? Wenn ja, kannst du mir bitte den Grund nennen? – Solace

+0

"Aber hast du meine Frage abgelehnt?" -- Nein, habe ich nicht. – CommonsWare

Antwort

0

Wartet nur den Rückruf onCaptureCompleted von Ihrem pictureCallback zu erhalten:

private CameraCaptureSession.CaptureCallback pictureCallback = new CameraCaptureSession.CaptureCallback() { 

     @Override 
     public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
             @NonNull CaptureRequest request, 
             @NonNull TotalCaptureResult result) { 

      // your picture has been taken 
    };