カメラを使ったアプリを開発しています。次のようなプレビュー クラスを作成しました。
public class MyPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.Preview Callback{
...
public void surfaceCreated(SurfaceHolder holder){
...
mCamera.setPreviewCallback(this);
...
}
public void surfaceDestroyed(SurfaceHolder holder){
...
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
...
}
public void onPreviewFrame(byte[] data, Camera camera){
...
}
}
基本的には CameraDemo の例です。Android CameraDemo の例
問題は、surfaceCreated が 1 回だけ呼び出される (本来あるべき方法) のに対して、surfaceChanged が (1 回だけではなく、またはサーフェスが変更されたときに) 常に呼び出されていることです。これが、onPreviewFrame が呼び出されない理由だと思います。カメラ フィードが画面に表示され、正常に動作しているように見えますが、実際にはそうではありません。
面白いことに、Android 2.x では問題なく動作し、問題は Android 4.1 でのみ発生します。(他のデバイスではテストしていません)
私は周りを見回しており、それがこのstackoverflow未解決の質問とこの別のstackoverflow未解決の質問、およびこのcode.googleケースの背後にある本当の理由であると考えています。この最後のケースには「解決策」がありますが、私にはうまくいきませんでした。
では、なぜ surfaceChanged が常に入力されているのか、それを解決する方法についてのアイデアはありますか?