2012-10-12 13 views
8

Ich werde die meine Android App durch Öffnen der Kamera und aktivieren Sie manuelle Fokussierung durch Berühren des Punktes in der Kamera. Die Kamera kann sich wieder auf den Punkt konzentrieren, auf den ich auf den Bildschirm gezeigt habe. Würden Sie mir bitte die Methodik nennen oder welche Komponente sollte ich ändern?Android Einstellung manuelle Fokus durch Berühren

Unten ist mein Code:

public void takePhoto(File photoFile, String workerName, int width, int height, int quality) { 
    if (getAutoFocusStatus()){ 
     camera.autoFocus(new AutoFocusCallback() { 
      @Override 
      public void onAutoFocus(boolean success, Camera camera) { 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 
    }else{ 
     camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 

this.photoFile = photoFile; 
this.workerName = workerName; 
this.imageOutputWidth = width; 
this.imageOutputHeight = height; 
} 

public void takePhoto(File photoFile, int width, int height, int quality) { 
takePhoto(photoFile, null, width, height, quality); 
} 
+0

Ich glaube, was Sie wollen heißt _assisted_ Fokus. http://en.wikipedia.org/wiki/Manual_focus, Manueller Fokus ist unmöglich: http://android.stackexchange.com/questions/2042/can-manual-focus-the-camera-on-my-android -phone (wie vor ein paar Jahren) – Annan

Antwort

11

Obwohl diese Antwort nicht zeigt, wie man sich auf einen einzelnen Bereich konzentriert, ist es definitiv nützlich zu zeigen, wie genau man die Kamera zu Anfang fokusiert.

Hier ist was ich getan habe. Dies funktioniert auf meinem Gerät (Droid DNA von HTC), gebaut in Android Studio sowohl

In OnSurfaceChanged() und OnSurfaceCreated(), ich habe den folgenden Code: (mCamera ist mein privates Camera Objekt)

 mCamera.stopPreview(); 
     Camera.Parameters p = mCamera.getParameters(); 
     p.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 

     mCamera.setParameters(p); 
     mCamera.setPreviewDisplay(surfaceHolder); 
     mCamera.startPreview(); 
     mCamera.autoFocus(null); 

In der Konstruktor, müssen Sie platzieren

 setFocusable(true); 
     setFocusableInTouchMode(true); 

Dies ermöglicht Ihnen, Fokusereignisse zu erhalten. Wie für die Erfassung von ihnen ...

public boolean onTouchEvent(MotionEvent event){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     Log.d("down", "focusing now"); 

     mCamera.autoFocus(null); 
    } 

    return true; 
} 
+1

IMO diese Antwort löst die Frage nicht, es setzt nur Autofokus (null). Es fokussiert die Kamera nicht auf den ausgewählten Punkt – Hugo

+0

Sie sind richtig. Darüber hinaus ist diese Kamera-API jetzt von API 21 http://developer.android.com/reference/android/hardware/Camera.html – Nlinscott

+0

nicht in htc one –

0

Der Schlüssel hier ist camera.autoFocus (autoFocusCallBack) und nach konzentrierten wir uns Methode autofocusCallback.onAutoFocus (boolean Erfolg, Kamera Kamera) genannt nennen wird - rufen Sie die camera.takePicture (Camera.ShutterCallback Shutter, Camera.PictureCallback roh, Camera.PictureCallback jpeg)

Mehr sehen: http://achorniy.wordpress.com/2009/12/29/how-to-use-autofocus-in-android/

oder

In Oberfläche verändert und vor Vorschau können Sie den Autofokus Einstellung verwenden, die die Brennweite automatisch eingestellt wird, dann starten die Vorschau, und dann auto- konzentrieren sich auf, was angezeigt wird ...

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

// Set camera properties first 
Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
     camera.setParameters(parameters); 

camera.startPreview(); 

camera.autoFocus(null); 

} 

Kredit: where to put autofocus in the class android camera

+0

Also, wenn ich das Ereignis arg für den Bildschirm berühren und dann den Autofokus wieder aufrufen und das löst mein Problem? –

1

Haben Sie versucht, setFocusAreas() zu verwenden, um den Fokusbereich festzulegen, den der Benutzer berührt hat?