2013-04-07 117 views

回答

8

您可以使用方法Camera.open(cameraId)進行檢查。

創建一個新的Camera對象來訪問特定的硬件攝像頭。如果相同的相機被其他應用程序打開,則會引發RuntimeException。

拋出 的RuntimeException
如果打開相機失敗(例如,如果照相機是在通過另一過程或設備策略管理器使用已禁用相機)。

更新:

例子:

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

您可以使用此方法使用,因爲保羅建議,但記住這件事記住,此方法首先獲取攝像機。

如果它成功獲取,則意味着沒有其他應用程序正在使用本相機,並且不會忘記再次釋放它,否則您將無法再次獲取它。

其投擲RuntimeException這意味着相機正在被其他進程或設備策略管理器禁用相機。

2

展望the source code of Cameraits JNI counterpart,最後the native code用於連接相機與服務,似乎確定相機在使用中的唯一方法是直接通過的Camera::connect(jint)結果。

問題在於,只能通過JNI功能android_hardware_Camera_native_setup(JNIEnv*, jobject, jobject, jint)來訪問此本機代碼,該代碼設置攝像頭以便在從new Camera(int)的Java創建Camera實例時使用。

總之,這似乎不可能。您必須嘗試打開相機,如果失敗,則認爲它已被其他應用程序使用。例如: -

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

爲了更好地瞭解相機的原生代碼,see this thread底層流。

6

如果您的設備API版本高於21,CameraManager.AvailabilityCallback可能是一個不錯的選擇。

您需要首先獲得系統的相機管理用下面的代碼:

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

然後,你需要註冊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); 
} 

這個工作,如果API版本更好高於21。你可以參考CameraManagerCameraManager.AvailabilityCallbackwhole package

試圖打開攝像頭,以檢查是否異常被拋出的作品好,如果API級別低於23 API等級23,攝像服務比以前不同,從official docs

訪問照相機子系統的資源,包括開口和配置相機裝置,授予基於客戶端應用程序的「優先級」。具有用戶可見或前景活動的應用程序進程通常被賦予更高優先級,使得相機資源獲取和使用更可靠。

當較高優先級的應用程序嘗試使用相機時,較低優先級應用程序的活動相機客戶端可能會被「驅逐」。在棄用的Camera API中,會導致爲被驅逐的客戶端調用onError()。在Camera2 API中,它會爲被驅逐的客戶端調用onDisconnected()。

我們可以看到,在API 23或更高,試圖打開其他應用程序所使用的攝像頭/過程將抓住從應用程序/過程,其使用的不是得到RuntimeException它,相機。

相關問題