2017-03-22 27 views
3

我正在嘗試使用SurfaceView捕獲照相機應用程序。關於getParameters失敗(空參數)

應用程序的概觀是

  1. 它可以檢測實時面(照相機視圖)。

  2. 它可以存儲電影。

我正在使用android.media.MediaRecord類來保存電影。

myRecorder = new MediaRecorder(); 
myRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
myRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/Movies/sample.3gp"); 
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
myRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
myRecorder.setVideoFrameRate(30); 
myRecorder.setVideoSize(320, 240); 
myRecorder.prepare(); 
myRecorder.start(); 

avobe步驟之後,發生的RuntimeException在下面的步驟(相機是android.hardware.Camera對象)

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    //Log.d(TAG, "onPreviewFrame: "); 

    int width = camera.getParameters().getPreviewSize().width; <-- 
    int height = camera.getParameters().getPreviewSize().height; 


03-22 22:54:09.134 27875-27875/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: wbcompany.co.jp.facedetector3, PID: 27875 
               java.lang.RuntimeException: getParameters failed (empty parameters) 
                at android.hardware.Camera.native_getParameters(Native Method) 
                at android.hardware.Camera.getParameters(Camera.java:2019) 
                at wbcompany.co.jp.facedetector3.CameraView.onPreviewFrame(CameraView.java:150) 
                at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1192) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:154) 
                at android.app.ActivityThread.main(ActivityThread.java:6189) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

調用 'myRecorder.start()' 之前,不會發生此異常。

我不知道這個錯誤的解決方案。 請給我解決這個問題。

我的運行環境: 的Android 7.0/API級別24

+0

在我的情況下,我是在Android API 22仿真器上的股票相機應用程序中獲取此信息。我通過在仿真器上使用32位x86操作系統映像而不是64位x86操作系統映像來修復它。 –

回答

1

這是一個奇怪的錯誤消息,但情況是非常真實的。當相機在MediaRecorder中忙時,其他用途將無法使用。

一般來說,在某些設備上訪問攝像機參數可能效率很低。強烈建議不要爲每個預覽幀調用camera.getParameters()。在CameraView類或嵌入它的活動中創建本地字段,並在開始預覽時在其中存儲寬度和高度。除非您明確停止相機並更改其配置,否則它們不會更改。

如果我沒有遺漏什麼,你的onPreviewFrame()回調發生在主(UI)線程上。好的做法是在單獨的HandlerThread上調用Camera.open(),以防止預覽處理過程放慢UI。

+0

對於遲到的回覆,我感到抱歉。謝謝你的好消息。我不知道camera.getParametes()是不推薦的。 –

+0

getParameters()非常好,但它很昂貴,不應該謹慎使用。 –