将捕获的图像从Camera2 Api传递到另一个活动

时间:2018-02-09 14:04:55

标签: java android android-camera2 android-developer-api

我只需使用Camera2 API(使用https://github.com/googlesamples/android-Camera2Basic的代码设计)来构建应用程序。早些时候,我使用相机API做同样的事情,结果非常好。现在,我能够捕获图像并将其保存在文件中。 我被困在这一点上: 我想将捕获的图像发送到另一个我希望在图像视图中显示图像的活动。与Camera API不同,Camera2 Api处理这个问题非常麻烦。 这是我试图传递意图的代码示例,即在我得到输出变量集之后,我想starActivity,将其传递给下一个Activity。 :

 /**
 * Saves a JPEG {@link Image} into the specified {@link File}.
 */
private static  class ImageSaver implements Runnable   {

    /**
     * The JPEG image
     */


    private final Image mImage;
    /**
     * The file we save the image into.
     */
    private final File mFile;

    ImageSaver(Image image, File file) {
        mImage = image;
        mFile = file;

    }

    @Override
    public void run() {
        ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
        byte[] bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
        FileOutputStream output = null;
        try {
            output = new FileOutputStream(mFile);
            output.write(bytes);
           Intent i = new Intent(current activity, next activity)
                   startActivity(i);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            mImage.close();

            if (null != output) {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

这是我想要将活动调用传递给下一个活动的(在camera2Basic代码中)。这个问题在这里面临的是,没有任何Context变量,或者Main活动的实例在这个类中可用,并且由于封闭方法是静态的,我无法启动活动/传递意图。

我用我正在使用的代码更新了它,但我正在寻找当我使用camera2 API时如何在活动之间进行转换。相机api的原因很容易。问题是run()函数在UI线程上运行,在初始化ImageReader时调用inturn。整个代码只是Camera2Basic代码。我试图添加的唯一内容是在活动之间进行转移,并将捕获的图像发送到新活动。

如果我能知道如何继续下去会很棒。 谢谢!

1 个答案:

答案 0 :(得分:2)

在实例化ImageSaver类时添加上下文变量。

Context mContext;

ImageSaver(Image image, File file, Context context) {
    mImage = image;
    mFile = file;
    mContext = context;
}

然后改变

 startActivity(i);

Intent i = new Intent(mContext, next activity)  
((Activity)mContext).startActivity(i);