Моя камера2 API застревает при съемке

Я создаю приложение камеры с помощью Camera 2 API, мой код для предварительного просмотра работает хорошо, а также щелкает изображения из предварительного просмотра и сохраняет их в каталоге. Моя проблема: он застревает при съемке и сохранении изображения, после сохранения изображения камера работает в обычном режиме.

Это мой код, который берет изображение для предварительного просмотра и сохраняет его:

onTakePhotoButtonClicked ():

public void onTakePhotoButtonClicked() {
    FileOutputStream outputPhoto = null;
    try {
        outputPhoto = new FileOutputStream(createImgFile());
        preview.getBitmap()
                .compress(Bitmap.CompressFormat.PNG, 100, outputPhoto);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (outputPhoto != null) {
                outputPhoto.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

createImgFile ():

private File createImgFile() throws IOException{

    String TimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String prepend = "IMG_"+TimeStamp+"_";
    File Imgfile = File.createTempFile(prepend,".jpg",mPictureFolder);
    mPictureFileName = Imgfile.getAbsolutePath();
    Toast.makeText(getApplicationContext(),mPictureFileName.toString(),Toast.LENGTH_SHORT).show();
    return Imgfile;
}

onCreate ():

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_mycamera_experiment);
    preview = (TextureView) findViewById(R.id.preview);
    click = (ImageButton) findViewById(R.id.click);
    createImgFolder();

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION_RESULT );

    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onTakePhotoButtonClicked();

        }
    });
}

Есть ли способ сделать снимок и вернуться к камере быстрее? Любая поправка, лучший метод?


person Community    schedule 17.09.2018    source источник
comment
@shriyans_varma, ваш вопрос: почему ваше приложение заблокировано ?!   -  person Amir133    schedule 17.09.2018
comment
да, это похоже на то, почему мое приложение застревает при нажатии кнопки камеры (вызывается onTakePhotoButtonClicked ()), и как только изображение делается из предварительного просмотра и сохраняется, камера в норме. У меня вопрос: как мне устранить эту задержку и нормально запустить камеру на переднем плане, пока изображение сохраняется?   -  person    schedule 17.09.2018


Ответы (1)


Потому что вы сохраняете растровое изображение в потоке пользовательского интерфейса. Вы должны сохранить растровое изображение в рабочем потоке.

И, если вы хотите делать снимки, вам лучше использовать ImageReader Api . Я думаю, что сохранение растрового изображения TextureView - не лучшая идея.

person sso.techie    schedule 18.09.2018
comment
Да, это имеет смысл. Я также использую ImageReader API. Большое спасибо за ваше предложение. - person ; 18.09.2018