Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 談談Android6.0運行時的權限處理

談談Android6.0運行時的權限處理

編輯:關於Android編程

運行時權限介紹

Android 6.0在我們原有的AndroidManifest.xml聲明權限的基礎上,

又新增了運行時權限動態檢測,以下權限都需要在運行時判斷:

     1、身體傳感器

     2、日歷

     3、攝像頭

     4、通訊錄

     5、地理位置

     6、麥克風

     7、電話

     8、短信

     9、存儲空間

在 Android 6.0 中,app 如果想要獲得某些權限,會在應用中彈出一個對話框,讓用戶確認是否授予該權限。

具體的截圖如下:

這要做的好處就是運行一個 app 時可以拒絕其中的某些權限,防止 app 觸及到你的隱私(比如說通訊錄、短信之類的)。而在 Android 6.0 之前,若同意安裝 app ,就意味著該 app 可以獲取權限列表中的所有權限。(注:這裡所指的都是原生 Android 系統,比如 MIUI 之類的第三方 ROM 很早就具備了這種功能。)

接下來就來看看相關的 API 吧,首先我們來看看 Context.checkSelfPermission(String permission) 方法,該方法主要用於檢測該 app 是否已經被賦予了某權限,傳入的參數有。如果已被賦予,則返回 PERMISSION_GRANTED ,否則返回 PERMISSION_DENIED

若返回了 PERMISSION_DENIED ,那麼我們就要去申請該權限了。這時就要用到 Activity.requestPermissions(String[] permissions, int requestCode) 這個方法了。顧名思義,該方法的作用就是申請某些權限了。第一個參數就是要申請的權限,可以看到參數形式是一個數組,也就是說可以一次申請多個權限。而第二個參數就是申請權限的代號,主要用於在之後的回調中選擇。

當用戶在權限申請的對話框中作出選擇後,就會回調 onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 方法。

     第一個參數就是上面的權限代號;

     第二個參數是申請的權限數組;

     第三個參數就是權限申請的結果。

結合上面的幾個方法,可以寫出如下所示的權限申請代碼模版:

public static final int READ_CONTACTS_REQUEST_CODE = 101;

// 如果權限沒有被授予
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) !=
 PackageManager.PERMISSION_GRANTED) {
 // 申請權限
 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE);
} else {
 // TODO 權限已經被授予

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 switch (requestCode) {
 case READ_CONTACTS_REQUEST_CODE:
  if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  // TODO 用戶已經授予了權限

  } else {
  // TODO 用戶拒絕授予權限

  }
  break;
 }

}

在這裡,還有一個方法需要注意下,那就是 shouldShowRequestPermissionRationale (Activity activity, String permission) 方法。這個方法的作用就是當用戶拒絕了某個權限之後,下一次就會顯示出需要該權限的說明。

關於運行時申請權限基本就這樣了,值得提醒的是,並不是所有的權限都需要運行時申請,只有“危險”的權限才通過運行時來申請。比如說讀取聯系人、獲取位置信息、讀寫SD卡等等都為“危險權限”,而比如振動、聯網、藍牙等就是普通權限了,就不需要運行時申請了。

說完了運行時申請權限後,另外還有一點需要注意的是,在 Android 6.0 顯示懸浮窗也有一個“坑”。如果調用平常的顯示懸浮窗的方法,會拋出 “permission denied for this window type” 異常。解決的方案就是在顯示懸浮窗之前,需要調用一下 Settings.canDrawOverlays(context) 這個方法。若該方法返回 true ,則說明用戶同意創建懸浮窗;否則可以跳轉到相關的設置頁面。具體的代碼模版如下:

if (Build.VERSION.SDK_INT >= 23) {
 if (Settings.canDrawOverlays(context)) {
 // 顯示懸浮窗
 } else {
 // 跳轉到相關的設置頁面
 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
 startActivity(intent);
 }
} else {
 // 版本低於Android 6.0,直接顯示懸浮窗
}

總結

好了,就到這裡吧,以上就是Android6.0運行時的權限處理的全部問題,希望這篇文章對大家開發Android能有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved