【问题标题】:Wait for Camera.PictureCallback等待 Camera.PictureCallback
【发布时间】:2016-06-02 23:34:53
【问题描述】:

场景:

我有一个 Activity (A),它调用另一个 Activity (B) 拍照并将Byte[] 发送回“A”。

Activity B 有一个 Button 用来拍照:

public void onClick(View v) {
            //get the current image from the camera
            mCamera.takePicture(null, null, mPicture);
            Intent data1 = new Intent();
            data1.putExtra("byte_array",dataPic);
            if (getParent() == null) {
                setResult(Activity.RESULT_OK, data1);
            } else {
                getParent().setResult(Activity.RESULT_OK, data1);
            }
            finish();

        }

这是我的 PictureCallback:

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions: " +
                    "no exception written by a boss");
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
            dataPic = data;

        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }

        mCamera.stopPreview();
        mCamera.release();

    }
};

我用startActivityForResult 启动了活动B,并在活动A 中实现了onActivityResult

问题:

我调试了我的代码并注意到onActivityResultonPictureTaken 之前被调用。所以逻辑上Byte[] 为空:(

我还尝试将onClick函数内的代码添加到onPictureTaken函数中(当然没有mCamera.takePicture), 无济于事,仍然为空。

也许我没有看到非常明显的东西,但我就是找不到解决方案。我尝试在这里寻找合适的问题,但找不到任何有用的东西。

问题:

有没有办法等待回调?或者也许是解决问题的另一种方法?

旁注:

请不要建议使用相机意图。

【问题讨论】:

  • 也许把setResult(Activity.RESULT_OK, data1);放在onPictureTaken里面。

标签: android android-activity android-camera


【解决方案1】:

我调试了我的代码并注意到 onActivityResult 在 onPictureTaken 之前被调用。所以逻辑上 Byte[] 为空

那是因为takePicture() 是异步的。

我也试过把onClick函数里面的代码加到onPictureTaken函数中(当然没有mCamera.takePicture),没用,还是null。

嗯,关于处理异步问题,这个是正确的答案。但是,除非您选择了较小的分辨率,否则您的Intent 会太大,并且在尝试发回结果时应该会崩溃。

有没有办法等待回调?

没有。

或者也许是解决问题的另一种方法?

关于“Intent太大”的问题,不要有两个活动。有一个活动,使用两个片段或一些类似的方法在两种状态之间更改您的 UI。

关于异步问题,将您的处理结果逻辑移至onPictureTaken(),在mCamera.release() 之后。在此过程中,摆脱dataPic(因为您不再需要它)并使用data(传入的byte[])。

【讨论】:

  • 哇,我怎么没有想到最简单的解决方案,将过程转移到结果中。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2018-05-04
  • 2020-05-09
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多