簡體   English   中英

拍照Android相機應用后延遲

[英]Delay after taking photo Android camera app

我正在創建一個基本的相機應用程序,作為一個小項目,旨在開始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) {

    }


}

編輯: pictureCallback中目前沒有任何內容。

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

}
  1. 您無需在stopPreview()之后調用takePicture() 並且您不需要在下一行上使用startPreview() 如果您希望在將圖片捕獲到Jpeg流中后重新啟動實時預覽,則確實需要onPictureTaken()回調內部使用startPreview() (而不是在發布的代碼中在onClick()中使用!!)

  2. 為了在使用相機時保持UI響應速度,應在后台線程上使用相機進行所有操作。 但是,僅在某些后台線程上調用Camera.open()Camera.close()是不夠的。 您必須創建一個Handler線程,並將其用於Camera.open() 相同的Looper將用於所有相機回調,包括PictureCallback.onPictureTaken() 請參閱我有關HandlerThread用法的詳細演練

  3. 正如我在其他地方解釋的那樣 ,如果在完全支持該API的設備上使用新的camera2 API,則可以實現更好的性能(但對於僅提供LEGACY級別的camera2支持的設備,最好使用舊的API)。

但是,如果您想從攝像機ISP獲得最大收益,這種凍結可能是不可避免的(這取決於制造商做出的許多硬件和固件設計選擇) 一些巧妙的UI調整可能有助於掩蓋此效果。

您需要啟用對Android手機上隱藏的“開發人員選項”菜單的訪問權限。 為此,只需點擊“設置”中的“關於手機”選項。 然后點擊“內部版本號”七次,操作完成。 現在,您可以返回到“設置”主菜單,並在列表底部附近找到“開發人員”選項。

==>現在您已經完成了那部分,讓真正的樂趣開始了。 點擊剛剛啟用的新開發者選項菜單,然后滾動直到看到以下三個設置(請注意,它們可能位於“高級”子部分中):

窗口動畫比例過渡動畫比例Animator動畫比例

==>您看到他們了嗎? 默認情況下,這三個選項中的每個選項均設置為“ 1x”,但點擊它們並將其更改為“ .5x”將極大地提高手機速度。 這種無害的調整迫使設備加快所有過渡動畫的速度,從而使整個用戶體驗更快,更流暢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM