Galaxy Nexus で新しい API 14+ FaceDetectionListenerを使用して、カメラ プレビューで顔を検出しています。すべてが正常に機能し、顔を拾うことができますが、SurfaceHolder が破棄されたときにカメラをシャットダウンしようとすると、「顔検出の停止に失敗しました」という RuntimeException が発生します。顔検出のセットアップと停止に使用しているコードは次のようになります。
public void surfaceChanged( SurfaceHolder holder, int format, int w, int h ) {
if( isPreviewRunning ) {
camera.stopPreview();
}
initPreview( w, h );
camera.startPreview();
if( enableFaceRecognition ) {
camera.startFaceDetection();
}
isPreviewRunning = true;
}
public void surfaceDestroyed( SurfaceHolder holder ) {
if( camera != null ) {
if( enableFaceRecognition ) {
try {
camera.stopFaceDetection();
} catch( Exception e ) {
Log.e( TAG, "Huh?", e );
}
}
cameraConfigured = false;
camera.stopPreview();
camera.release();
camera = null;
}
}
ああ、そして:
enableFaceRecognition = camera.getParameters().getMaxNumDetectedFaces() > 0
編集:
logcat の出力は次のとおりです。
07-31 18:59:47.809: E/Preview(9410): Huh?
07-31 18:59:47.809: E/Preview(9410): java.lang.RuntimeException: stop face detection failed
07-31 18:59:47.809: E/Preview(9410): at android.hardware.Camera._stopFaceDetection(Native Method)
07-31 18:59:47.809: E/Preview(9410): at android.hardware.Camera.stopFaceDetection(Camera.java:1138)
07-31 18:59:47.809: E/Preview(9410): at app.face.Preview.surfaceDestroyed(Preview.java:126)
07-31 18:59:47.809: E/Preview(9410): at android.view.SurfaceView.updateWindow(SurfaceView.java:517)
07-31 18:59:47.809: E/Preview(9410): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226)
07-31 18:59:47.809: E/Preview(9410): at android.view.View.dispatchWindowVisibilityChanged(View.java:5839)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:965)
07-31 18:59:47.809: E/Preview(9410): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
07-31 18:59:47.809: E/Preview(9410): at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 18:59:47.809: E/Preview(9410): at android.os.Looper.loop(Looper.java:137)
07-31 18:59:47.809: E/Preview(9410): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-31 18:59:47.809: E/Preview(9410): at java.lang.reflect.Method.invokeNative(Native Method)
07-31 18:59:47.809: E/Preview(9410): at java.lang.reflect.Method.invoke(Method.java:511)
07-31 18:59:47.809: E/Preview(9410): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-31 18:59:47.809: E/Preview(9410): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-31 18:59:47.809: E/Preview(9410): at dalvik.system.NativeStart.main(Native Method)
この例外の原因は何ですか?