国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

談?wù)凙ndroid6.0運行時的權(quán)限處理

2019-12-12 05:37:49
字體:
供稿:網(wǎng)友

運行時權(quán)限介紹

Android 6.0在我們原有的AndroidManifest.xml聲明權(quán)限的基礎(chǔ)上,

又新增了運行時權(quán)限動態(tài)檢測,以下權(quán)限都需要在運行時判斷:

     1、身體傳感器

     2、日歷

     3、攝像頭

     4、通訊錄

     5、地理位置

     6、麥克風(fēng)

     7、電話

     8、短信

     9、存儲空間

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

具體的截圖如下:

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

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

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

當(dāng)用戶在權(quán)限申請的對話框中作出選擇后,就會回調(diào) onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 方法。

     第一個參數(shù)就是上面的權(quán)限代號;

     第二個參數(shù)是申請的權(quán)限數(shù)組;

     第三個參數(shù)就是權(quán)限申請的結(jié)果。

結(jié)合上面的幾個方法,可以寫出如下所示的權(quán)限申請代碼模版:

public static final int READ_CONTACTS_REQUEST_CODE = 101;// 如果權(quán)限沒有被授予if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 申請權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE);} else { // TODO 權(quán)限已經(jīng)被授予}@Overridepublic 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 用戶已經(jīng)授予了權(quán)限  } else {  // TODO 用戶拒絕授予權(quán)限  }  break; }}

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

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

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

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

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 株洲市| 互助| 鹿泉市| 措勤县| 娄底市| 策勒县| 甘德县| 葫芦岛市| 锡林浩特市| 兴安盟| 仁寿县| 汕尾市| 抚州市| 哈密市| 郧西县| 原平市| 镇巴县| 阿瓦提县| 田林县| 山丹县| 新泰市| 收藏| 白城市| 江阴市| 东山县| 井冈山市| 乐昌市| 蓝山县| 石柱| 甘肃省| 江门市| 通道| 登封市| 宣化县| 互助| 新疆| 始兴县| 崇义县| 德兴市| 饶平县| 嘉祥县|