[英]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() {
}
您無需在stopPreview()
之后調用takePicture()
。 並且您不需要在下一行上使用startPreview()
。 如果您希望在將圖片捕獲到Jpeg流中后重新啟動實時預覽,則確實需要在onPictureTaken()
回調內部使用startPreview()
(而不是在發布的代碼中在onClick()
中使用!!) 。
為了在使用相機時保持UI響應速度,應在后台線程上使用相機進行所有操作。 但是,僅在某些后台線程上調用Camera.open()
或Camera.close()
是不夠的。 您必須創建一個Handler線程,並將其用於Camera.open()
。 相同的Looper將用於所有相機回調,包括PictureCallback.onPictureTaken()
。 請參閱我有關HandlerThread用法的詳細演練 。
正如我在其他地方解釋的那樣 ,如果在完全支持該API的設備上使用新的camera2 API,則可以實現更好的性能(但對於僅提供LEGACY級別的camera2支持的設備,最好使用舊的API)。
但是,如果您想從攝像機ISP獲得最大收益,這種凍結可能是不可避免的(這取決於制造商做出的許多硬件和固件設計選擇) 。 一些巧妙的UI調整可能有助於掩蓋此效果。
您需要啟用對Android手機上隱藏的“開發人員選項”菜單的訪問權限。 為此,只需點擊“設置”中的“關於手機”選項。 然后點擊“內部版本號”七次,操作完成。 現在,您可以返回到“設置”主菜單,並在列表底部附近找到“開發人員”選項。
==>現在您已經完成了那部分,讓真正的樂趣開始了。 點擊剛剛啟用的新開發者選項菜單,然后滾動直到看到以下三個設置(請注意,它們可能位於“高級”子部分中):
窗口動畫比例過渡動畫比例Animator動畫比例
==>您看到他們了嗎? 默認情況下,這三個選項中的每個選項均設置為“ 1x”,但點擊它們並將其更改為“ .5x”將極大地提高手機速度。 這種無害的調整迫使設備加快所有過渡動畫的速度,從而使整個用戶體驗更快,更流暢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.