2014-01-23 56 views
1

我遇到了問題卡住的問題camera.takePicture()在所需圖片尺寸較高的情況下,jpeg回調調用的頻率較低。例如。它總是以640x480成功,但僅適用於5%至40%的情況,並且參數調整較小,分辨率爲3264x2448。 相關代碼:相機takePicture並不總是根據圖片尺寸進行jpeg回調

public void foo(View view) { 
    Camera.PictureCallback jpegCallback = new Camera.PictureCallback(){ 
     @Override 
     public void onPictureTaken(byte[] bytes, Camera camera) { 
      camera.release(); 
      Toast.makeText(SurvCamActivity.getInstance(), "jpeg callback", Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    //Gets desired resolution 
    SpinnerResolution res = getSelectedSpinnerResolution(); 
    Camera camera = getCameraInstance(); 
    try { 
     Camera.Parameters params = camera.getParameters(); 
     params.setPictureSize(res.width, res.height); 
     camera.setParameters(params); 
     camera.setPreviewTexture(new SurfaceTexture(R.layout.fragment_preview)); 
     camera.startPreview(); 
     camera.takePicture(null, null, jpegCallback); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

現在奇怪的事情是,如果我添加斷點camera.takePicture(),一旦線程到達那裏總是調用JPEG回調只是恢復執行。當我在camera.takePicture()之後加入Thread.sleep(700)時,它也開始始終如一地進行回調。有任何想法嗎?在Nexus 4上測試。

+0

什麼是調用'foo()'的邏輯?你不能在'jpegCallback.onPictureTaken()'開始之前在'foo()'中調用'camera.takePicture()'。 –

+0

foo是按鈕onclick函數 – user3227998

回答

0

編輯︰原來的相機對象可能有垃圾收集。我創建了靜態引用,現在它沒有問題。

+0

我不知道你爲什麼堅持每次釋放相機。如果你保留它,也許你可以達到更短的滯後期。 –

1

您不能在jpegCallback.onPictureTaken()啓動之前再次調用camera.takePicture(),因此您需要節流button.onClick()。如果您始終將相機保持在預覽模式,則可能會減少他的滯後。

+0

這種方法的問題是''camera.getParameters()''應該已經發生了異常,因爲下一個'button.onClick()'因爲它已經被使用而無法獲取相機實例。它也不能解釋爲什麼當只有一個按鈕點擊時回調沒有啓動。 – user3227998