1. 程式人生 > >android 判斷攝像頭是否可用(6.0以下 )

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

Camera permission has been disabled for current app

而魅族MX5的比較怪,其他的魅族機沒有測試
Caused by: java.lang.RuntimeException: Camera is being used after Camera.release() was called

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以下系統判斷當前攝像頭是否可用” 目前我是這樣處理的,感覺不太好,以後有更好的處理辦法再替換吧!