Задержка после съемки фото приложения для Android-камеры - PullRequest
0 голосов
/ 28 августа 2018

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

Когда я нажимаю кнопку, чтобы сделать снимок, происходит задержка примерно в 1 секунду, при которой предварительный просмотр останавливается, а затем снова размораживается. С сбоями проблем нет - только проблема с зависанием. Почему это происходит и как я могу это исправить?

Ниже приведен метод создания экземпляра камеры, а также мой класс SurfaceView.

 private void startCamera() {

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    cameraPreviewLayout = (FrameLayout) findViewById(R.id.camera_preview);

    camera = checkDeviceCamera();
    camera.setDisplayOrientation(90);

    mImageSurfaceView = new ImageSurfaceView(MainActivity.this, camera);
    cameraPreviewLayout.addView(mImageSurfaceView);

    ImageButton captureButton = (ImageButton)findViewById(R.id.imageButton);
    captureButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            camera.takePicture(null, null, pictureCallback);
            camera.stopPreview();
            camera.startPreview();
        }
    });
}

public class ImageSurfaceView extends SurfaceView implements 

SurfaceHolder.Callback {
    private Camera camera;
    private SurfaceHolder surfaceHolder;

    public ImageSurfaceView(Context context, Camera camera) {
        super(context);
        this.camera = camera;
        this.surfaceHolder = getHolder();
        this.surfaceHolder.addCallback(this);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
                this.camera.setPreviewDisplay(holder);
                this.camera.startPreview();
                this.camera.setDisplayOrientation(90);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }


}

РЕДАКТИРОВАТЬ: В настоящее время на картинке нет ничего. Обратный звонок.

Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

}

Ответы [ 2 ]

0 голосов
/ 28 августа 2018
  1. Вам не нужно звонить stopPreview() после takePicture(). И вам не нужно startPreview() на следующей строке. Вам нужно startPreview() внутри вашего onPictureTaken() обратного вызова (не в onClick(), как в отправленном коде !!) , если вы хотите предварительный просмотр в перезапустите после захвата изображения в поток JPEG.

  2. Чтобы пользовательский интерфейс реагировал на использование камеры, вы должны выполнять всю работу с камерой в фоновом потоке. Но недостаточно вызвать Camera.open() или Camera.close() на некотором фоновом потоке. Вы должны создать поток обработчика и использовать его для Camera.open(). Один и тот же Looper будет использоваться для всех обратных вызовов камеры, включая PictureCallback.onPictureTaken(). Смотрите мое подробное пошаговое руководство по использованию HandlerThread.

  3. Как я объяснил в другом месте , вы можете добиться еще большей производительности, если будете использовать новый camera2 API на устройствах, которые полностью поддерживают этот API ( но лучше использовать старый API с устройствами, которые обеспечивают только LEGACY-уровень поддержки camera2).

Но если вы хотите получить максимум от интернет-провайдера камеры, этот тип заморозки может быть неизбежным (это зависит от многих вариантов аппаратного и микропрограммного обеспечения, сделанных производителем), Некоторые хитрые настройки интерфейса могут помочь скрыть этот эффект.

0 голосов
/ 28 августа 2018

Вам необходимо включить доступ к скрытому меню «Параметры разработчика» на ваш телефон Android. Для этого просто нажмите «О телефоне» в Настройки. Затем нажмите «Построить номер» семь раз, и все готово. Теперь ваша очередь можете просто вернуться в главное меню настроек, и вы найдете разработчика варианты где-то в нижней части списка.

==> Теперь, когда вы закончили с этой частью, пусть начнется настоящее веселье. Коснитесь нового меню параметров разработчика, которое вы только что включили, и прокрутите, пока не см. следующие три параметра (обратите внимание, что они могут быть расположены в подраздел «Дополнительно»:

Масштаб окна анимации Масштаб перехода анимации Анимация анимации шкала

==> Вы их видели? По умолчанию для каждого из этих трех параметров установлено значение «1x», но при их нажатии и изменении на «.5x» значительно ускори свой телефон. Этот безвредный твик заставляет устройство ускоряться все анимации перехода, и весь пользовательский опыт быстрее и ровнее в результате

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...