2012-03-22 27 views
15

Vì vậy, tôi đã đọc qua API máy ảnh và không thể tìm thấy bất kỳ điều gì về điều này. Tôi đang sử dụng Camera để chụp khung và nó hoạt động hoàn hảo, cho đến khi tôi cố gắng nhả camera. Tôi lặp lại các lỗi trong một chuỗi các cuộc gọi:lỗi phát hành máy ảnh android từ PreviewCallback

camera = Camera.open(); 
camera.setPreviewDisplay(getHolder()); 
Parameters params = camera.getParameters(); 
List<Size> ls = params.getSupportedPreviewSizes(); 
Size size = ls.get(1); 
this.width = size.width; 
this.height = size.height; 
params.setPreviewSize(size.width, size.height); 
camera.setParameters(params); 
camera.setDisplayOrientation(90); 
camera.setPreviewCallback(this); 
camera.startPreview(); 
camera.stopPreview(); 
camera.release(); 

Các lỗi tôi nhận được là

03-22 13:31:42.592: E/AndroidRuntime(14152): java.lang.RuntimeException: Method called after release() 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera.setHasPreviewCallback(Native Method) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera.access$600(Camera.java:114) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:545) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.os.Looper.loop(Looper.java:130) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.app.ActivityThread.main(ActivityThread.java:3684) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at java.lang.reflect.Method.invokeNative(Native Method) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at java.lang.reflect.Method.invoke(Method.java:507) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:845) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at dalvik.system.NativeStart.main(Native Method) 

Vì vậy, bất cứ điều gì đang xảy ra không phải là một trong các chức năng của tôi. Nếu tôi nhận xét ra camera.setPreviewCallback (điều này); sau đó lỗi này không xuất hiện, nhưng tôi rõ ràng bị mất gọi lại của tôi, đó là toàn bộ điểm bao gồm cả máy ảnh trong ứng dụng của tôi.

+0

Tôi cũng phải đối mặt với cùng một vấn đề, tôi cố định nó bằng cách sử [http://stackoverflow.com/a/34064944/4531507](http: //stackoverflow.com/a/34064944/4531507) –

+0

Nguyên tắc chung là mọi cuộc gọi trên máy ảnh đều có thể ném RuntimeException bất kỳ lúc nào, ngay cả khi cuộc gọi cụ thể không có ngoại lệ này được ghi lại chính thức. Nếu thiết bị thử nghiệm của bạn không bao giờ hoạt động sai theo cách này, hãy yên tâm rằng một số phần mềm không mong muốn của phần cứng, ROM và phần mềm đã cài đặt sẽ gây ra sự cố này theo cách tái sản xuất hoặc không thể tái sản xuất. –

Trả lời

60

Bạn cần phải gọi lại xem trước unset trước camera.release(), sau camera.stopPreview():

camera.setPreviewCallback(null); 

Nếu không nó có thể được gọi sau khi máy ảnh đã được phát hành.

+0

Cảm ơn, đã làm việc như một sự quyến rũ. –

+0

Điều này cũng phù hợp với tôi. Các câu trả lời stackoverflow khác đã đề cập đến nó, nhưng chìa khóa cho tôi là nó cần phải được thực hiện giữa camera.stopPreview và camera.release(). Cảm ơn! – Danation

+0

cảm ơn bạn rất nhiều !! – jlopez

12

Là một mặt lưu ý, một phương pháp hoàn toàn releaseCamera trông giống như:

// release Camera for other applications 
private void releaseCamera() { 
    // check if Camera instance exists 
    if (mCamera != null) { 
     sPreviewing = false; 
     // first stop preview 
     mCamera.stopPreview(); 
     // then cancel its preview callback 
     mCamera.setPreviewCallback(null); 
     // and finally release it 
     mCamera.release(); 
     // sanitize you Camera object holder 
     mCamera = null; 
    } 
} 
+0

Đó là nó, đó là tất cả những gì cần thiết! Chỉ cần cẩn thận để đặt nó ở đúng nơi, bởi vì vấn đề của tôi là tôi đã có một vị trí thứ hai, nơi tôi đã cố gắng để 'stopPreview()' và tất nhiên nó đã bị rơi .. – Apostrofix

+0

@Apostrofix, để chỉ dừng camera bạn có thể muốn tạo một phương thức khác nếu bạn sử dụng nó ở nhiều nơi hoặc kiểm tra xem đối tượng 'mCamera' có rỗng không trước khi dừng nó. – georger

Các vấn đề liên quan