Передача захваченного изображения из Camera2 Api в другое действие

Мне нужно просто использовать Camera2 API (используя дизайн кода https://github.com/googlesamples/android-Camera2Basic), чтобы создать приложение. Раньше я использовал API камеры, чтобы сделать то же самое, и результаты были неплохими. Прямо сейчас я могу захватить изображение и сохранить его в файле. Я застрял на этом этапе: Я хочу отправить захваченное изображение другому действию, в котором я хочу отобразить изображение в виде изображения. В отличие от Camera API, Camera2 Api довольно громоздко справляется с этим. Это пример кода, в котором я пытаюсь передать намерение, т.е. сразу после того, как я получаю набор выходных переменных, я хотел бы использовать starActivity, чтобы передать его следующему действию. :

 /**
 * 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) я хочу передать вызов действия следующему действию. Эта проблема, с которой я сталкиваюсь здесь, заключается в том, что в этом классе нет какой-либо переменной контекста или экземпляра основного действия, и поскольку метод включения является статическим, я не могу запустить действие/передать намерение.

я обновил его кодом, который я использую, но я ищу, как я могу переключаться между действиями, когда я использую API camera2. вызвать в камере API, это легко. проблема заключается в том, что функция run() запускается в потоке пользовательского интерфейса, который inturn вызывается при инициализации ImageReader. Весь код — это просто код Camera2Basic. единственное, что я пытаюсь добавить, это перенос между действиями и отправка изображения, снятого в новое действие.

Было бы здорово, если бы я мог понять, как действовать дальше. Благодарю вас!


person DragonsCanDance    schedule 09.02.2018    source источник
comment
Вы разместили нерелевантный код.   -  person greenapps    schedule 09.02.2018
comment
код - это просто образец, в котором устанавливаются изображение и файл, мой вопрос вращается вокруг идеи передачи информации другому действию.   -  person DragonsCanDance    schedule 09.02.2018
comment
Да. Я понимаю. Но вы могли бы показать более релевантный код для начала.   -  person greenapps    schedule 09.02.2018
comment
привет, я обновил его кодом, который я использую, но я ищу, как я могу переключаться между действиями, когда я использую API camera2. вызвать в камере API, это легко. проблема заключается в том, что функция run() запускается в потоке пользовательского интерфейса, который inturn вызывается при инициализации ImageReader. таким образом, и весь код - это просто код Camera2Basic, ссылку на который я дал в вопросе. единственная часть, которую я пытаюсь добавить, - это передача между действиями между изображениями.   -  person DragonsCanDance    schedule 09.02.2018
comment
Обратите внимание, что запись ByteBuffer из mImage.getPlanes()[0] — неправильный способ сохранить пиксели для будущего использования.   -  person Alex Cohn    schedule 10.02.2018
comment
@AlexCohn У меня похожая проблема .. так как правильно сохранить пиксели для будущего использования?   -  person Kent Lauridsen    schedule 14.11.2018
comment
@KentLauridsen изображение возвращается в формате YUV 420 в виде 3 плоскостей. Иногда getPlanes[0] возвращает весь буфер 420. Но безопасный способ — скопировать пиксели из каждой плоскости в соответствии с шириной, высотой и шагом.   -  person Alex Cohn    schedule 14.11.2018


Ответы (1)


Добавьте контекстную переменную при создании экземпляра класса ImageSaver.

Context mContext;

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

Затем измените

 startActivity(i);

to

Intent i = new Intent(mContext, next activity)  
((Activity)mContext).startActivity(i);
person greenapps    schedule 09.02.2018
comment
в каком обратном вызове я должен написать startActivity(), я немного запутался. - person Richa; 08.05.2019