Tôi đang sử dụng API máy ảnh để viết một ứng dụng: hiển thị xem trước và chụp ảnh. Phiên bản đầu tiên hoạt động rất tốt. Trong lớp Preview kéo dài SurfaceView thực hiện SurfaceHolder.CallbackỨng dụng API camera Android bị lỗi tại onResume
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
hasSurface = true;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// It will be called immediately after surfaceCreated
// I move it to Resume.
setCameraPreviewParameters();
camera.startPreview();
}
Trong hoạt động chính:
public class CameraDemo extends Activity
Tôi cũng thiết lập một thành viên: CameraUnit ui; Đó là:
public class CameraUnit extends LinearLayout
Trong onCreate,
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ui = new CameraUnit(this);
setContentView((View) ui);
Log.d(TAG, "onCreate'd");
}
nó tạo ra một đối tượng LinearLayout, chứa các surfaceView, và phím chụp ảnh.
Các onResume là:
@Override
protected void onResume() {
super.onResume();
}
Mặc dù nó hoạt động, tôi nghĩ rằng onResume không nên trống rỗng. Tôi cũng thấy bề mặtCreated và surfaceChanged rỗng trong famous Android app example OCRTest Vì vậy, tôi tin rằng nó là tốt hơn và cũng khả thi để di chuyển các lệnh trong surfaceCreated và surfaceChanged thành onResume.
Tôi nghĩ rằng trò chuyện dòng chảy cho phiên bản 1 của ứng dụng của tôi nên là: hoạt động chính thức onCreate (nơi LinearLayout và surfaceView của nó, nút camera được tạo ra), surfaceCreated và surfaceChanged được gọi là, onResume.
Vì vậy, tôi có thể chỉ cần di chuyển các lệnh trong surfaceCreated và surfaceChanged thành onResume. Nhưng nó không hoạt động! Tôi đã sử dụng Debug để tìm hiểu bề mặt rỗng. Tôi nghĩ rằng surfaceCreatd không được gọi. Ứng dụng của tôi là OCRTest khác, thực hiện SurfaceHolder.Callback trong hoạt động chính. Tôi thực hiện SurfaceHolder.Callback trong SurfaceView:
class Preview extends SurfaceView implements SurfaceHolder.Callback
Vì vậy, tôi thêm hai dòng khác trong onResume
ui.preview.surfaceCreated(ui.preview.mHolder);
ui.preview.surfaceChanged(ui.preview.mHolder, 0, 800, 400);
tôi đặt một cách ngẫu nhiên ba đối số số nguyên cuối cùng. Khi tôi bắt đầu hoạt động, cửa sổ lỗi trong điện thoại Android bật ra. Nó nói “Gây ra bởi: java.lang.RuntimeException: Không kết nối với dịch vụ máy ảnh”. Nhưng làm thế nào để sửa chữa nó ???? Cảm ơn rất nhiều!
lỗi là:
01-07 00:27:57.173: W/dalvikvm(11625): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
01-07 00:27:57.173: E/AndroidRuntime(11625): FATAL EXCEPTION: main
01-07 00:27:57.173: E/AndroidRuntime(11625): java.lang.RuntimeException: Unable to resume activity {com.example/com.example.CameraDemo}: java.lang.RuntimeException: Fail to connect to camera service
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2460)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2481)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.access$1500(ActivityThread.java:132)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Handler.dispatchMessage(Handler.java:99)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Looper.loop(Looper.java:150)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.main(ActivityThread.java:4263)
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invokeNative(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invoke(Method.java:507)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-07 00:27:57.173: E/AndroidRuntime(11625): at dalvik.system.NativeStart.main(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): Caused by: java.lang.RuntimeException: Fail to connect to camera service
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.native_setup(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.<init>(Camera.java:265)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.open(Camera.java:241)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.Preview.surfaceCreated(Preview.java:60)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.CameraDemo.onResume(CameraDemo.java:64)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Activity.performResume(Activity.java:3904)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2450)
01-07 00:27:57.173: E/AndroidRuntime(11625): ... 12 more
01-07 00:27:59.455: I/Process(11625): Sending signal. PID: 11625 SIG: 9
Tôi hiểu rằng nó có thể liên quan đến chuỗi triển khai của OnCreate, onResume và tạo bề mặt, vv .. Có vẻ như nếu lớp SurfaceView thực hiện SurfaceHolder.Callback, bề mặt chưa sẵn sàng ngay cả khi chúng ta đang ở điểm của onResume của Activity. Sau đó, khi chúng ta đã sẵn sàng? Nếu Hoạt động thực hiện SurfaceHolder.Callback, trình tự vốn có là gì? Cứu giúp!!!! – user1914692