如何檢測裝置是否有Camera?

在做影像處理的應用時,可能會需要用到裝置內的 Camera 來截取影像。而 Android 裝置百百種,不一定每台都有相機,因此如何在沒有相機的裝置上避免程式發生錯誤就是必須考量的。

第一種狀況是當你的應用會上架至 Google Play 商店時,請用 AndroidManifest.xml 中的 <uses-feature> 與 <uses-permission> 標籤宣告會使用 Camera 功能及相關權限:
例如:
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>

這樣你的應用程式就不會出現在無 Camera 裝置的 Google Play 商店中,使用者無法下載,自然也就避免了發生錯誤的可能。

第二種狀況是使用者可能從第三方市集或透過其他途徑取得軟體,那就不一定都有完善的篩選機制了,因此你可能必須在程式內部做判斷處理,以避免Crash。

第三種狀況是 Camera 並非你應用中的主要功能,即使裝置沒有 Camera,還是可以使用其他功能,但使用者介面可能必需做一些調整,比如隱藏呼叫 Camera 的按鍵或是在使用者試圖使用 Camera 相關功能時跳出提示訊息。

而針對狀況二與狀況三,可用的判斷方法如下:
PackageManager packageManager = context.getPackageManager();

if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.i("camera", "This device has camera!");
} else {
    Log.i("camera", "This device has no camera!");
}
簡單說就是利用 PackageManager 檢查裝置是否有 Camera 功能,注意PackageManager.FEATURE_CAMERA 是 API Level 7 才有,而 API Level 9 還多了 PackageManager.FEATURE_CAMERA_FRONT 可以檢查是否有前置 Camera。

至於想檢查裝置的其他功能(如 Telephony、NFC 等等... ),也可以依此類推。

補充1: 會需要檢測這個功能是因為最近將應用上架到 Amazon Appstore,他們回覆說在 Kindle Fire 上執行某些功能時會 Crash,因為它沒有內建 Camera 。
補充2: 這段程式碼用模擬器測試時很怪,即使將 Camera supports 設為 no,依舊會回傳true @@...

參考連結:

這個網誌中的熱門文章

Android Studio 如何調整字型大小

App在Google Play被停權與恢復的經驗分享

Android Studio 無法在實機上 Run/Debug 程式?