2011-10-24 51 views
2

嘗試從服務(無GUI)拍攝照片時,在某些設備上,我收到RuntimeException。但是,如果我使用SurfaceHolder從活動中拍攝照片,它將起作用。Android在沒有SurfaceHolder的情況下拍攝照片

Camera.Parameters parameters = camera.getParameters(); 
parameters.setPictureFormat(PixelFormat.JPEG); 
camera.setParameters(parameters); 
SurfaceView mview = new SurfaceView(context); 
camera.setPreviewDisplay(mview.getHolder()); 
camera.startPreview(); 
camera.takePicture(null,null,iccb); 

該序列正常工作的大多數設備,但,特別是關於摩托羅拉Droid,調用takePicture方法(實際上是本地方法)將拋出一個RuntimeException。還嘗試過camera.setPreviewDisplay(null),但它也不起作用。

但是,如果我從一個Activity使用真正的SurfaceView,它也可以在Droid上正常工作,但我需要從後臺服務中完成。

您是否認爲此行爲是由於隱私原因顯示的,因此沒有人可以在不實際顯示圖像的情況下拍照?這對我來說沒什麼意義,因爲我可以加載一個帶有0大小預覽的虛擬活動,它可以工作,但我很樂意不必這樣做。

logcat的輸出:

10-24 12:20:57.838 D/CameraHal(267): hardware/ti/omap4/omap3/camera-omap4/src/CameraHal.cpp:189 enableMsgType - Preview callback not enabled 1c2 
10-24 12:20:57.838 E/CameraHal(267): hardware/ti/omap4/omap3/camera-omap4/src/CameraHal.cpp:2448 takePicture - takePicture called with image buffer 0x0 
10-24 12:20:57.838 D/AndroidRuntime(29248): Shutting down VM 
10-24 12:20:57.838 W/dalvikvm(29248): threadid=1: thread exiting with uncaught exception (group=0x4001e560) 
10-24 12:20:57.846 E/AndroidRuntime(29248): FATAL EXCEPTION: main 
10-24 12:20:57.846 E/AndroidRuntime(29248): java.lang.RuntimeException: takePicture failed 
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.native_takePicture(Native Method) 
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.takePicture(Camera.java:829) 
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.takePicture(Camera.java:793) 

任何幫助是非常讚賞

+0

請添加你的異常的堆棧跟蹤,並仔細閱讀logcat輸出,尤其是,如果攝像頭被訪問,摩托羅拉Droid會記錄很多有用的信息。 – HefferWolf

+0

謝謝@HefferWolf的回答。 是的,對不起,這是堆棧跟蹤: 了java.lang.RuntimeException:takePicture在android.hardware.Camera.native_takePicture(本機方法) 失敗 在android.hardware.Camera.takePicture(Camera.java:829) 在android.hardware.Camera.takePicture(Camera.java:793) – mindless

回答

1

這是一個安全問題。如果沒有預覽視圖,則不應使用攝像機。這應該防止在用戶不知情的情況下惡意使用相機,例如用於間諜目的。

+0

那麼這就是我的想象。摩托羅拉可能出於隱私原因實施了這樣的事情。無論如何,很高興知道是否有另一個解決方法,而不是在虛擬活動上設置0大小的預覽。 – mindless

+0

這不是摩托羅拉誰已經實施它,但每個誰不符合指導方針:) –

+0

hehe感謝指出:) 我編輯我的帖子與LogCat輸出。你是否仍然認爲缺乏實​​際預覽的原因? – mindless

0

這似乎是最現代的Android設備現在檢查一個SurfaceView存在並具有非零寬度和高度(我的三星Galaxy SII噴出在這種情況下警告,並不會拍攝照片)。有趣的是,如果SurfaceView的寬度和高度爲1dip那麼它工作得很好。

<SurfaceView android:id="@+id/surface_view" 
    android:layout_width="1dip" 
    android:layout_height="1dip" /> 

爲1個像素的SurfaceView的寬度和高度是令人難以置信的很難看,並同時它的工作原理,但它仍然屬於「安全問題」的範疇。

相關問題