【问题标题】:Camera Preview onPictureTaken return wrong data in android相机预览onPictureTaken在android中返回错误的数据
【发布时间】:2017-12-03 14:25:27
【问题描述】:

我写了一个程序来完成相机叠加,我发现当我在onPictureTaken()中设置变量“image_data”时,它不会立即改变值,当我再次调用onPictureTaken时它会改变值 我无法解决,谁能帮帮我?

private PictureCallback jpegCallback = new PictureCallback()  
{public void setImageData(byte[] b) {
  image_data = b;
}
  @Override
  public void onPictureTaken(byte[] data, Camera camera) 
  {

    if (mCamera != null){
      mCamera.startPreview();}

    FileOutputStream outStream = null;
    try {
      // Write to SD Card
      outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",
        System.currentTimeMillis()) );
      outStream.write(data);
      outStream.close();
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);

      Log.d(TAG, String.valueOf(data));
      image_data = data;
      setImageData(data);  //neither direct assign nor setImageData are invalid
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
    }

    Log.d(TAG, "onPictureTaken - jpeg");
  }
};

CameraTestActivity 代码

mCamera.takePicture();
Toast toast = Toast.makeText(CameraTestActivity.this,
          "PhotoTaken"+mCamera.getImageData(), Toast.LENGTH_LONG);
  toast.show();

第一张照片拍摄的吐司节目是“PhotoTaken null” 二次输出为“PhotoTaken B@c4f05e2”

以下是logcat数据

12-03 22:19:20.416 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: onPictureTaken - wrote bytes: 1644369
12-03 22:19:20.416 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: [B@c4f05e2
12-03 22:19:29.631 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: onPictureTaken - wrote bytes: 1622238
12-03 22:19:29.631 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: [B@adb9e2e

【问题讨论】:

  • the first time I call obPictureTaken() it returned null. ???一个不调用 onPictureTaken()。你也不。它不能返回 null,因为它是一个 void 函数。你的话完全没有意义。
  • 您应该将 Toast 放入 onPictureTaken。好吧,如果可能的话。
  • 我的英语不好..请不要介意,我的意思是当我在 onPictureTaken() 中设置变量“image_data”时,它不会立即更改值,它会更改值我再次调用 onPictureTaken

标签: android camera android-camera overlay android-camera-intent


【解决方案1】:

mCamera.takePicture() 需要传递一个PictureCallback,那么你在哪里传递你的PictureCallback(在你的代码中,我看到你的callbackjpegCallback)?

Toast.makeText(CameraTestActivity.this, "PhotoTaken" + mCamera.getImageData(), Toast.LENGTH_LONG).show()应该正确写在PictureCallback下面,而不是下面。

例如:

mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    // your code in here is correct ✔︎
                }
            });

但是

mCamera.takePicture(null, null, new Camera.PictureCallback() {
                                    @Override
                                    public void onPictureTaken(byte[] data, Camera camera) {
                                    }
                                });
// your code in here is wrong ✕

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多