天天看點

安卓-運作時權限安卓 運作時權限

安卓 運作時權限

概述

為什麼要有運作時權限?

如果沒有運作時權限,在你下載下傳好app時,app需要的權限一次性獲得,這時你不會知道他需要什麼權限;或者,有些功能明明不需要某項權限(比如音樂播放和位置權限),但是他又偏偏擷取了該權限,沒有該權限則無法工作,這時候該怎麼解決?

運作時權限即需要該項權限時再授權,或者是僅在運作時給予app該權限。是以上面提到的問題通過運作時權限能較好的解決。

但開發者需要注意,你不能僅靜态注冊權限,即在Manifest.xml檔案中注冊了檔案,如:

如果你僅是完成了靜态注冊,那麼你在把項目打包成apk,下載下傳到手機後你會發現,手機并沒有給予你該項權限。

是以你需要在用到該權限的功能啟動之前進行權限檢查和申請,即所謂的運作時權限。

權限檢查

假設我們需要的權限是讀取sd卡的權限。

先要對權限進行檢查,看手機是否給了該權限給app。

//檢查權限
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            //沒有獲得權限的操作
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
        }else {
            initView();
        }
           

可以看到,如果手機給予了權限給app,則直接執行該功能即可。

如果沒有授權的話,則需要調用ActivityCompat.requestPermissions()方法來向使用者申請授權,requestPermission()方法接收3個參數,第一個參數要求是Activity的執行個體,第二個參數是一個String數組,我們把要申請的權限名放在數組中即可,第三個參數是請求碼,隻要是唯一值就可以,這裡傳入1。

授予權限

@SuppressLint("NotifyDataSetChanged")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(MainActivity.this, "授權成功", Toast.LENGTH_LONG).show();
                initView();
            } else {
                Toast.makeText(MainActivity.this, "拒絕授權你将搜尋不到本地音樂。", Toast.LENGTH_LONG).show();
            }
        }
    }
           

調用完requestPermissions()方法之後,系統會彈出一個權限申請的對話框,然後使用者可以選擇同意或者拒絕我們的權限申請,不論是哪種結果,最終都會回調到onRequstPermission()方法中,而授權的結果則會封裝在grantResults參數當中。這裡我們隻需要判斷一下最後的授權結果,如果使用者同意的話就調用功能的邏輯代碼即可,如果使用者拒絕的話我們隻能放棄操作,并且彈出一條失敗提示。

上一篇: 安卓報錯