安卓 運作時權限
概述
為什麼要有運作時權限?
如果沒有運作時權限,在你下載下傳好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參數當中。這裡我們隻需要判斷一下最後的授權結果,如果使用者同意的話就調用功能的邏輯代碼即可,如果使用者拒絕的話我們隻能放棄操作,并且彈出一條失敗提示。