2013-01-07 34 views
5

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 
+0

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

Trả lời

5

Bạn nhận được

java.lang.RuntimeException: Fail to connect to camera service 

ngoại lệ này, khi máy ảnh đang được sử dụng bởi các ứng dụng khác. Nhưng tôi tin rằng ứng dụng khác là ứng dụng của bạn. Bạn phải nhả Camera.

Đây là những trường hợp bạn nên thả Camera:

Trong lớp Preview:

public void surfaceDestroyed(SurfaceHolder holder) { 

    // empty. Take care of releasing the Camera preview in your activity. 
    if (mCamera != null) { 
     mCamera.release(); 
    } 
} 

Trong Hoạt động:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
    finish(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
} 

Cũng vào Cancel đã nhấp vào và cả khi bạn kết thúc bằng cách sử dụng Máy ảnh tức là .., khi Hình ảnh được chụp và bạn quay trở lại Hoạt động.

Cũng thử này:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    if (mHolder.getSurface() == null) { 
     return; 
    } 

    try { 
     mCamera.stopPreview(); 
    } catch (Exception e) { 
     //You can ignore this, because this means the Preview doesn't Exist 
     //So, no need to try stopping 
    } 

    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     //Catch this 
    } 
} 
+0

Cảm ơn bạn rất nhiều. Tôi đã bao gồm các chức năng phát hành máy ảnh này ở những nơi đó. Và phiên bản đầu tiên của ứng dụng của tôi hoạt động rất tốt. Như tôi đã nói, tôi muốn di chuyển các lệnh trong surfaceCreated và surfaceChanged thành onResume. Vấn đề là cuộc gọi đầu tiên của onResume không hoạt động. Vì vậy, tôi đoán nó có thể liên quan đến các mối quan hệ giữa onResume và các cuộc gọi đến bề mặt. Điều gì về ý kiến ​​của bạn? – user1914692

+0

Làm việc cho tôi !! – GAMA

0

Tôi tìm thấy trong một số ví dụ, mã mở camera được bao gồm cả trong surfaceChanged, và trong onResume, sử dụng một nếu câu để tránh lặp lại. Có lẽ đây là một cách để giải quyết vấn đề.

1

Vì vậy, tôi đã tạo một ứng dụng sử dụng máy ảnh nhưng một Biểu tượng khởi chạy khác để truy cập trang cài đặt. Vì vậy, mỗi khi tôi tạm dừng và giảm thiểu ứng dụng để thay đổi cài đặt và quay trở lại, nó cũng bị lỗi với Lỗi này. Vì vậy, sau rất nhiều nghiên cứu tôi vẫn không có câu trả lời. Sau đó, tôi nhận ra điều này đã làm với việc quản lý vòng đời của máy ảnh. Vì vậy, đã đi và nhìn vào Vòng đời, đặc biệt tại Pausing. Vì vậy, tôi đã nhận ra, tất cả chúng ta đều làm điều này theo phương pháp sai. Nơi chúng tôi đang làm nó trên onResume, chúng ta nên làm điều đó onStart. VÀ BAM! nó đã làm việc.

Đây là mã của tôi cho ứng dụng của tôi.

@Override 
    protected void onPause() { 
     super.onPause(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 

    } 

    @Override 
    protected void onStart(){ 
     super.onStart(); 
//Check if the camera exists or not so it does not clash with the onCreate 
     if(mCamera == null){ 
      dir_string = new File("/storage/sdcard1/app"); 
      Log.d("TAG",dir_string.toString()); 
      mCamera = getCameraInstance(); 
      mPreview = new CameraPreview(this, mCamera); 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.addView(mPreview); 
     } 
    } 

Hy vọng điều này giúp đỡ người nào đó ít nhất.

+0

không hoạt động. – exshinigami

+0

Lỗi của bạn mà bạn đang nhận được là gì? – user2365554

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