談?wù)凙ndroid6.0運(yùn)行時(shí)的權(quán)限處理
運(yùn)行時(shí)權(quán)限介紹
Android 6.0在我們?cè)械?code>AndroidManifest.xml聲明權(quán)限的基礎(chǔ)上,
又新增了運(yùn)行時(shí)權(quán)限動(dòng)態(tài)檢測(cè),以下權(quán)限都需要在運(yùn)行時(shí)判斷:
1、身體傳感器
2、日歷
3、攝像頭
4、通訊錄
5、地理位置
6、麥克風(fēng)
7、電話
8、短信
9、存儲(chǔ)空間
在 Android 6.0 中,app 如果想要獲得某些權(quán)限,會(huì)在應(yīng)用中彈出一個(gè)對(duì)話框,讓用戶確認(rèn)是否授予該權(quán)限。
具體的截圖如下:
這要做的好處就是運(yùn)行一個(gè) app 時(shí)可以拒絕其中的某些權(quán)限,防止 app 觸及到你的隱私(比如說(shuō)通訊錄、短信之類的)。而在 Android 6.0 之前,若同意安裝 app ,就意味著該 app 可以獲取權(quán)限列表中的所有權(quán)限。(注:這里所指的都是原生 Android 系統(tǒng),比如 MIUI 之類的第三方 ROM 很早就具備了這種功能。)
接下來(lái)就來(lái)看看相關(guān)的 API 吧,首先我們來(lái)看看 Context.checkSelfPermission(String permission)
方法,該方法主要用于檢測(cè)該 app 是否已經(jīng)被賦予了某權(quán)限,傳入的參數(shù)有。如果已被賦予,則返回 PERMISSION_GRANTED
,否則返回 PERMISSION_DENIED
。
若返回了 PERMISSION_DENIED
,那么我們就要去申請(qǐng)?jiān)摍?quán)限了。這時(shí)就要用到 Activity.requestPermissions(String[] permissions, int requestCode)
這個(gè)方法了。顧名思義,該方法的作用就是申請(qǐng)某些權(quán)限了。第一個(gè)參數(shù)就是要申請(qǐng)的權(quán)限,可以看到參數(shù)形式是一個(gè)數(shù)組,也就是說(shuō)可以一次申請(qǐng)多個(gè)權(quán)限。而第二個(gè)參數(shù)就是申請(qǐng)權(quán)限的代號(hào),主要用于在之后的回調(diào)中選擇。
當(dāng)用戶在權(quán)限申請(qǐng)的對(duì)話框中作出選擇后,就會(huì)回調(diào) onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
方法。
第一個(gè)參數(shù)就是上面的權(quán)限代號(hào);
第二個(gè)參數(shù)是申請(qǐng)的權(quán)限數(shù)組;
第三個(gè)參數(shù)就是權(quán)限申請(qǐng)的結(jié)果。
結(jié)合上面的幾個(gè)方法,可以寫(xiě)出如下所示的權(quán)限申請(qǐng)代碼模版:
public static final int READ_CONTACTS_REQUEST_CODE = 101; // 如果權(quán)限沒(méi)有被授予 if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 申請(qǐng)權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE); } else { // TODO 權(quán)限已經(jīng)被授予 } @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 用戶已經(jīng)授予了權(quán)限 } else { // TODO 用戶拒絕授予權(quán)限 } break; } }
在這里,還有一個(gè)方法需要注意下,那就是 shouldShowRequestPermissionRationale (Activity activity, String permission)
方法。這個(gè)方法的作用就是當(dāng)用戶拒絕了某個(gè)權(quán)限之后,下一次就會(huì)顯示出需要該權(quán)限的說(shuō)明。
關(guān)于運(yùn)行時(shí)申請(qǐng)權(quán)限基本就這樣了,值得提醒的是,并不是所有的權(quán)限都需要運(yùn)行時(shí)申請(qǐng),只有“危險(xiǎn)”的權(quán)限才通過(guò)運(yùn)行時(shí)來(lái)申請(qǐng)。比如說(shuō)讀取聯(lián)系人、獲取位置信息、讀寫(xiě)SD卡等等都為“危險(xiǎn)權(quán)限”,而比如振動(dòng)、聯(lián)網(wǎng)、藍(lán)牙等就是普通權(quán)限了,就不需要運(yùn)行時(shí)申請(qǐng)了。
說(shuō)完了運(yùn)行時(shí)申請(qǐng)權(quán)限后,另外還有一點(diǎn)需要注意的是,在 Android 6.0 顯示懸浮窗也有一個(gè)“坑”。如果調(diào)用平常的顯示懸浮窗的方法,會(huì)拋出 “permission denied for this window type” 異常。解決的方案就是在顯示懸浮窗之前,需要調(diào)用一下 Settings.canDrawOverlays(context) 這
個(gè)方法。若該方法返回 true ,則說(shuō)明用戶同意創(chuàng)建懸浮窗;否則可以跳轉(zhuǎn)到相關(guān)的設(shè)置頁(yè)面。具體的代碼模版如下:
if (Build.VERSION.SDK_INT >= 23) { if (Settings.canDrawOverlays(context)) { // 顯示懸浮窗 } else { // 跳轉(zhuǎn)到相關(guān)的設(shè)置頁(yè)面 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(intent); } } else { // 版本低于Android 6.0,直接顯示懸浮窗 }
總結(jié)
好了,就到這里吧,以上就是Android6.0運(yùn)行時(shí)的權(quán)限處理的全部問(wèn)題,希望這篇文章對(duì)大家開(kāi)發(fā)Android能有所幫助。
- Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析
- Android獲取ROOT權(quán)限的實(shí)例代碼
- Android權(quán)限控制之自定義權(quán)限
- Android中Root權(quán)限獲取的簡(jiǎn)單代碼
- Android需要提升權(quán)限的操作方法
- android編程判斷應(yīng)用是否具有某個(gè)權(quán)限的方法
- Android無(wú)需申請(qǐng)權(quán)限撥打電話的兩種方式
- Android用代碼獲取手機(jī)root之后的最高權(quán)限
- Android 手動(dòng)獲取判斷處理權(quán)限
- Android輔助權(quán)限的介紹和配置完整記錄
相關(guān)文章
AndroidQ分區(qū)存儲(chǔ)權(quán)限變更及適配的實(shí)現(xiàn)
這篇文章主要介紹了AndroidQ分區(qū)存儲(chǔ)權(quán)限變更及適配的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Android自定義HorizontalScrollView打造超強(qiáng)Gallery效果
這篇文章主要介紹了Android自定義HorizontalScrollView打造圖片橫向滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Android程序開(kāi)發(fā)之Listview下拉刷新上拉(滑動(dòng)分頁(yè))加載更多
這篇文章主要介紹了Android程序開(kāi)發(fā)之Listview下拉刷新上拉(滑動(dòng)分頁(yè))加載更多的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07android暫?;蛲V蛊渌魳?lè)播放器的播放實(shí)現(xiàn)代碼
來(lái)自android自帶的music源碼,下面是廣播接收的代碼,通過(guò)發(fā)送廣播來(lái)控制音樂(lè)的播放,停止等2013-11-11Android圖片上傳實(shí)現(xiàn)預(yù)覽效果
這篇文章主要介紹了Android圖片上傳實(shí)現(xiàn)預(yù)覽效果的相關(guān)資料,需要的朋友可以參考下2016-01-01取消Android Studio項(xiàng)目與SVN關(guān)聯(lián)的方法
今天小編就為大家分享一篇關(guān)于取消Android Studio項(xiàng)目與SVN關(guān)聯(lián)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12