2

これに関して多くの質問があることは承知していますが、私が直面している問題はどの質問でも解決されていないと思います。すべてのさまざまな質問から、私はこのサービスを書きました。問題は、onStartCommand メソッドのすべての try-catch ブロックで「成功」を取得していますが、Callback メソッド (ShutterCallback および PictureCallback) のログが処理されていないことです。これは、写真が撮られているが、コールバックが呼び出されていないことを意味すると思います。これは奇妙です。

Camera cam;
Parameters param;
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d("CAMERA", "onPictureTaken - raw");
    }
};

ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.i("CAMERA", "onShutter'd");
    }
};

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    try {
        cam = Camera.open();
        Log.i("CAMERA", "Success");
    } catch (RuntimeException e) {
        Log.e("CAMERA", "Camera currently unavailable");
        e.printStackTrace();
    }
    try {
        param = cam.getParameters();
        cam.setParameters(param);
        Log.i("CAMERA", "Success");
    } catch (Exception e1) {
        Log.e("CAMERA", "Parameter problem");
        e1.printStackTrace();
    }
    try {
        SurfaceView view = new SurfaceView(this);
        cam.setPreviewDisplay(view.getHolder());
        cam.startPreview();
        Log.i("CAMERA", "Success");
    } catch (Exception e) {
        Log.e("CAMERA", "Surface Problem");
        e.printStackTrace();
    }
    try {
        cam.takePicture(shutterCallback, rawCallback, null);
        Log.i("CAMERA", "Success");
    } catch (Exception e) {
        Log.e("CAMERA", "Click Failure");
        e.printStackTrace();
    }
    cam.release();
    return super.onStartCommand(intent, flags, startId);
}
4

3 に答える 3

2

takePicture メソッドを呼び出した直後にカメラを離さないでください。コールバックを実行するのに十分な時間をカメラに与える必要があります。ところで、JPG コールバックも追加することをお勧めします。また、カメラをリリースする前に stopPreview を呼び出すこともできます。コードは次のようになります。

Camera cam;
Parameters param;
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d("CAMERA", "onPictureTaken - raw");
        camera.stopPreview();
        camera.release();
    }
};

PictureCallback jpgCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d("CAMERA", "onPictureTaken - jpg");
        camera.stopPreview();
        camera.release();
    }
};

ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.i("CAMERA", "onShutter'd");
    }
};

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    try {
        cam = Camera.open();
        Log.i("CAMERA", "Success");
    } catch (RuntimeException e) {
        Log.e("CAMERA", "Camera currently unavailable");
        e.printStackTrace();
    }
    try {
        param = cam.getParameters();
        cam.setParameters(param);
        Log.i("CAMERA", "Success");
    } catch (Exception e1) {
        Log.e("CAMERA", "Parameter problem");
        e1.printStackTrace();
    }
    try {
        SurfaceView view = new SurfaceView(this);
        cam.setPreviewDisplay(view.getHolder());
        cam.startPreview();
        Log.i("CAMERA", "Success");
    } catch (Exception e) {
        Log.e("CAMERA", "Surface Problem");
        e.printStackTrace();
    }
    try {
        cam.takePicture(shutterCallback, rawCallback, null);
        Log.i("CAMERA", "Success");
    } catch (Exception e) {
        Log.e("CAMERA", "Click Failure");
        e.printStackTrace();
    }
    // Commented out following line and moved it into your callbacks
    //cam.release();
    return super.onStartCommand(intent, flags, startId);
}
于 2013-10-14T23:39:19.303 に答える
0

これらの重要なポイントを見逃しています:

  1. SurfaceViewを WindowManager に追加する必要があります。
  2. サーフェスを使用する前に、サーフェスが作成されるのを待ちませんでした。で、プレビューをview.getHolder()使用addCallbackして設定および初期化し、コールバックのsurfaceCreatedメソッドで写真を撮ります。
于 2014-11-22T23:13:19.840 に答える
0

PictureCallback に属する takePicture メソッドの 3 番目のパラメーターとして「null」を渡しています。

あなたのコード:

try {
        cam.takePicture(shutterCallback, rawCallback, null);
        Log.i("CAMERA", "Success");
    } catch (Exception e) {
        Log.e("CAMERA", "Click Failure");
        e.printStackTrace();
    }

以下のように変更します。

try {
            cam.takePicture(shutterCallback,null,rawCallback);
            Log.i("CAMERA", "Success");
        } catch (Exception e) {
            Log.e("CAMERA", "Click Failure");
            e.printStackTrace();
        }
于 2015-08-14T07:31:49.740 に答える