2013-04-07 36 views

Trả lời

8

Bạn có thể kiểm tra bằng phương pháp Camera.open(cameraId).

Tạo đối tượng Máy ảnh mới để truy cập máy ảnh phần cứng cụ thể. Nếu cùng một máy ảnh được mở bởi các ứng dụng khác, điều này sẽ ném một RuntimeException.

Ném RuntimeException
Nếu mở máy ảnh bị lỗi (Ví dụ, nếu máy ảnh được sử dụng bởi một quá trình hoặc chính sách thiết bị quản lý đã vô hiệu hóa máy ảnh).

Cập nhật:

Ví dụ:

public boolean isCameraUsebyApp() { 
    Camera camera = null; 
    try { 
     camera = Camera.open(); 
    } catch (RuntimeException e) { 
     return true; 
    } finally { 
     if (camera != null) camera.release(); 
    } 
    return false; 
} 

Bạn có thể sử dụng phương pháp này để sử dụng như Paul đề nghị nhưng giữ điều này trong tâm trí rằng phương pháp này đầu tiên mua máy ảnh.

Nếu ứng dụng của nó thành công thì điều đó có nghĩa là không ứng dụng nào khác đang sử dụng máy ảnh này và không quên phát hành lại nếu không bạn sẽ không thể lấy lại.

Nó ném RuntimeException nó có nghĩa là máy ảnh đang được sử dụng bởi một quy trình hoặc trình quản lý chính sách thiết bị khác đã tắt máy ảnh.

2

Nhìn vào the source code of Camera, its JNI counterpart, và cuối cùng the native code để kết nối một máy ảnh với dịch vụ, có vẻ như cách duy nhất để xác định nếu máy ảnh được sử dụng là trực tiếp thông qua kết quả của Camera::connect(jint).

Sự cố là mã gốc này chỉ có thể truy cập thông qua chức năng JNI android_hardware_Camera_native_setup(JNIEnv*, jobject, jobject, jint), thiết lập máy ảnh để sử dụng khi tạo cá thể Máy ảnh từ Java trong new Camera(int).

Tóm lại, dường như không thể. Bạn sẽ phải cố gắng để mở máy ảnh, và nếu nó không thành công, giả sử nó đang được sử dụng bởi ứng dụng khác. Ví dụ:

public boolean isCameraInUse() { 
    Camera c = null; 
    try { 
     c = Camera.open(); 
    } catch (RuntimeException e) { 
     return true; 
    } finally { 
     if (c != null) c.release(); 
    } 
    return false; 
} 

Để hiểu rõ hơn dòng gốc của mã gốc của máy ảnh, see this thread.

6

Nếu phiên bản API thiết bị của bạn cao hơn 21, CameraManager.AvailabilityCallback có thể là lựa chọn tốt.

Bạn cần phải đầu tiên được người quản lý camera của hệ thống với đoạn mã sau:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

Sau đó, bạn cần phải đăng ký AvailabilityCallback:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() { 
     @Override 
     public void onCameraAvailable(String cameraId) { 
      super.onCameraAvailable(cameraId); 
      //Do your work 
     } 

     @Override 
     public void onCameraUnavailable(String cameraId) { 
      super.onCameraUnavailable(cameraId); 
      //Do your work 
     } 
    }, yourHandler); 
} 

này hoạt động tốt hơn nếu phiên bản API cao hơn 21.Bạn có thể tham khảo CameraManager, CameraManager.AvailabilityCallbackwhole package

Đang cố gắng để mở camera để kiểm tra xem ngoại lệ được ném hoạt động tốt nếu mức API thấp hơn 23. Trong mức API 23, dịch vụ camera khác so với trước đây, từ số official docs:

Truy cập vào tài nguyên hệ thống phụ của máy ảnh, bao gồm mở và định cấu hình thiết bị camera, được trao dựa trên "ưu tiên" của quy trình đăng ký ứng dụng khách. Các quy trình ứng dụng với các hoạt động có thể nhìn thấy hoặc tiền cảnh thường được ưu tiên cao hơn, giúp việc mua lại tài nguyên máy ảnh và sử dụng đáng tin cậy hơn.

Các ứng dụng máy ảnh hiện hoạt cho các ứng dụng có mức ưu tiên thấp hơn có thể bị "gỡ bỏ" khi ứng dụng ưu tiên cao hơn cố gắng sử dụng máy ảnh. Trong API Camera không được chấp nhận, điều này dẫn đến onError() được gọi cho ứng dụng bị gỡ bỏ. Trong API Camera2, kết quả là onDisconnected() được gọi cho ứng dụng bị gỡ bỏ.

Chúng tôi có thể thấy rằng trong API 23 trở lên, cố gắng mở máy ảnh được ứng dụng/quá trình khác sử dụng sẽ thu giữ máy ảnh từ ứng dụng/quá trình đang sử dụng nó thay vì nhận RuntimeException.

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