android 判斷攝像頭是否可用(6.0以下 )
android 6.0以下系統判斷當前攝像頭是否可用
問題概述
android 應用程式無法判定當前是否有攝像頭的使用許可權,是否可用。
附一篇6.0許可權的文章,有概論、有圖還有程式碼。輕鬆解決應用程式判斷是否有許可權的問題。android 6.0 許可權簡述、思路分析和程式碼實踐
問題描述
在做ocr 的時候遇到個問題,點選拍照/掃描頁面的入口Button,彈出一個對話方塊 “申請拍照和錄影許可權” “禁止”/“允許”。如果這個時候點選了“禁止”,或者自己在移動裝置的許可權設定裡把APP的 “拍照和攝像” 許可權改為拒絕(或者禁止)。那麼當我們在app 中再想呼叫拍照和攝像的功能就不行了, 有的手機沒有任何反應,有的乾脆就直接掛掉。
問題分析
android 6.0 Google 對Android的許可權做了比較大的修改,比較好處理。問題主要是體現在6.0 以下的系統。
這是我用的一款測試機打印出來的log,忘記是三星還是小米了。
Caused by: Camera permission has been disabled for current app
而魅族MX5的比較怪,其他的魅族機沒有測試
Caused by: java.lang.RuntimeException: Camera is being used after Camera.release() was called
最開始的時候還以為是攝像頭的資源沒有釋放掉之類的問題引起的,但是在“許可權管理”中把攝像頭的許可權開啟就沒有這種問題,真心醉了,為什麼會報這樣的錯誤?!!!但是問題肯定是許可權導致的。
問題解決
網上有種方法是根據 checkPermission 判斷許可權,但這是判斷是否在清單檔案中註冊了許可權,並不能判斷當前的攝像頭是否被禁止,可用!
1. PackageManager pm = getPackageManager();
2. boolean permission = (PackageManager.PERMISSION_GRANTED ==
3. pm.checkPermission("android.permission.CAMERA ", "packageName"));
4. if (permission) {
5. showToast("有這個許可權");
6. }else {
7. showToast("木有這個許可權");
8. }
找到種可行的處理方法,是用抓取 Camera.open() 異常的方法來解決,比較暴力。
public class PermissionTool {
/**
* 判斷攝像頭是否可用
* 主要針對6.0 之前的版本,現在主要是依靠try...catch... 報錯資訊,感覺不太好,
* 以後有更好的方法的話可適當替換
*
* @return
*/
public static boolean isCameraCanUse() {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
// setParameters 是針對魅族MX5 做的。MX5 通過Camera.open() 拿到的Camera
// 物件不為null
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
canUse = false;
}
if (mCamera != null) {
mCamera.release();
}
return canUse;
}
}
而我們可以在APP進入拍照/掃描 頁面的入口處,會先針對許可權進行檢查。如果有攝像頭許可權,則正常使用;沒有攝像頭使用許可權,可以彈出個許可權彈層或者相關提示之類的告訴使用者正在使用的app 沒有攝像頭許可權,需要自己開啟。
if (PermissionTool.isCameraCanUse()) {
跳轉到相關的拍照/掃描 頁面
} else {
當前APP沒有攝像頭許可權彈層,或者其他相關提示
}
關於問題 “android 6.0以下系統判斷當前攝像頭是否可用” 目前我是這樣處理的,感覺不太好,以後有更好的處理辦法再替換吧!