2012-01-21 31 views
8

Tôi có ứng dụng Android cổ điển với xem trước máy ảnh (phổ biến có thể được tìm thấy trong nhiều hướng dẫn [marakana, v.v.]) được cho là chụp ảnh trong một khoảng thời gian nhất định. Threading và giết chết chủ đề được thực hiện, lỗi như vậy "method called after release" được xử lý. Nhưng đôi khi lỗi nổi tiếng xảy ra 100. Tôi chấp nhận thực tế là nó xảy ra và cố gắng xử lý nó. Tôi đã triển khai ErrorCallback và phương thức onError của mình khi đối tượng máy ảnh hiện tại được phát hành và khởi tạo một đối tượng mới như được viết trong tài liệu chính thức.tạo lại đối tượng máy ảnh sau khi lỗi 100 (máy ảnh camera đã chết)

Nhưng (không có gì ngạc nhiên) nó không đủ. Máy ảnh mới có thể bị phân phối sai do một thông báo "CameraDemo has been exited unexpectedly" xuất hiện ngay bây giờ. Tôi đã đọc nhiều tài liệu và ví dụ với hy vọng, rằng một thủ tục thích hợp sẽ được giải thích ở đâu đó nhưng không ai có vấn đề như vậy rõ ràng. Vì vậy, tôi muốn hỏi tôi nên làm gì khác ngoài việc phát hành và tạo camera mới? Đây là mã:

ErrorCallback CEC = new ErrorCallback() 
{ 
    public void onError(int error, Camera camera) 
    { 
     Log.d("CameraDemo", "camera error detected"); 
     if(error == Camera.CAMERA_ERROR_SERVER_DIED) 
     { 
      Log.d("CameraDemo", "attempting to reinstantiate new camera"); 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); //written in documentation... 
      camera = null;    
      camera = Camera.open(); 

     } 
    } 
}; 

Ngay - nếu tôi phát hành và tạo camera trong onError gọi lại sau đó RuntimeException Phương pháp gọi là sau khi phát hành (takePicture) được nâng lên. Vì vậy, tôi nên bằng cách nào đó gán mặt giữ cho máy ảnh một lần nữa hoặc tạo lại các chủ bề mặt quá?

Sẽ đủ để hướng dẫn tôi, ví dụ: cho một số diễn đàn, nơi nó được mô tả hoặc giải quyết, vv Cảm ơn bạn đã giúp đỡ.

+0

Bạn đã tìm thấy một giải pháp? Vui lòng chia sẻ – Gena

Trả lời

0

Trong ứng dụng của tôi để xử lý các Camere tôi sử dụng này:

public void onResume() { 
    super.onResume(); 
if(mCamera == null) 
    mCamera = getCameraInstance(): 
} 


public static Camera getCameraInstance() { 
mCamera = null; 
    try { 
     mCamera = Camera.open(); 
Parameters parameters = mCamera.getParameters(); 
    mCamera.cancelAutoFocus(); 
    mCamera.setPreviewCallback(yourPreviewCb); 
    mCamera.startPreview(); 
    mCamera.setParameters(parameters); 

    mCamera.autoFocus(yourAutoFocusCB); 
    } catch (Exception e) { 
     //TODO 
    } 
    return mCamera; 
} 

Các mCamera = null trong getCameraInstance() là chỉ để đảm bảo không có máy ảnh chạy ở tất cả.

Tôi nghĩ rằng bạn cần phải tạo một máy ảnh hoàn chỉnh, không chỉ cần mở nó với Set

camera.open(); 

này trong onResume hoặc trong callback lỗi, tùy thuộc vào nhu cầu của bạn.

+0

Cảnh báo! Khi 'surfaceChanged' được gọi khi bề mặt thay đổi (kích thước ví dụ), nếu đối tượng' Camera' không được làm lại Nếu màn hình đã thay đổi kích thước, nó sẽ dẫn đến Lỗi 100. Đây là lỗi do màn hình máy ảnh bị sửa đổi (trên các thiết bị cũ, máy ảnh đôi khi bị trễ và bị kẹt dẫn đến kích thước màn hình xem trước bị thay đổi). - Nói cách khác, hãy chắc chắn giữ một mắt trên 'surfaceChanged', nó cũng dễ bị tạo ra lỗi 100. –

0

Đây là cách tôi cố định nó, đây là một mẫu mã, nghĩ rằng bạn sẽ có được ý tưởng:

private Camera camera; 

// code... 

public Camera getCameraInstance() { 
    Camera camera = Camera.open(); 
    // code... 
    camera.setErrorCallback(new ErrorCallback() { 
     @Override 
     public void onError(int error, Camera camera) { 
      if(error == Camera.CAMERA_ERROR_SERVER_DIED) { 
       releaseCamera(); 
       startCamera(); 
      } 
     } 
    }); 
    return camera; 
} 

protected void startCamera() { 
    if(getCamera() == null) 
     setCamera(getCameraInstance()); 
    refreshCamera(); 
} 

protected void releaseCamera() { 
    if (getCamera() != null) { 
     getCamera().release(); 
     setCamera(null); 
    } 
} 

public Camera getCamera() { 
    return camera; 
} 

public void setCamera(Camera camera) { 
    this.camera = camera; 
} 
Các vấn đề liên quan