Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解
Google 在 Android 6.0 開始引入了權(quán)限申請(qǐng)機(jī)制,將所有權(quán)限分成了正常權(quán)限和危險(xiǎn)權(quán)限。App 每次在使用危險(xiǎn)權(quán)限時(shí)需要?jiǎng)討B(tài)的申請(qǐng)并得到用戶的授權(quán)才能使用。
權(quán)限分類
系統(tǒng)權(quán)限分為兩類:正常權(quán)限和危險(xiǎn)權(quán)限。
正常權(quán)限:不會(huì)直接給用戶隱私帶來危險(xiǎn)。如果你在其清單中列出了正常權(quán)限,系統(tǒng)將自動(dòng)授予該權(quán)限。
危險(xiǎn)權(quán)限:授予應(yīng)用訪問用戶機(jī)密數(shù)據(jù)的權(quán)限。如果你在清單文件中列出了危險(xiǎn)權(quán)限,則用戶必須明確批準(zhǔn)你的應(yīng)用使用這些權(quán)限。那么危險(xiǎn)權(quán)限有那些?日歷(CALENDAR)、相機(jī)(CAMERA)、通訊錄(CONTACTS)、位置(LOCATION)、撥號(hào)(PHONE)、短信(SMS)和存儲(chǔ)(STORAGE)等。
<!-- 權(quán)限組:CALENDAR == 日歷讀取的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <!-- 權(quán)限組:CAMERA == 相機(jī)打開的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 權(quán)限組:CONTACTS == 聯(lián)系人通訊錄信息獲取/寫入的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- 權(quán)限組:LOCATION == 位置相關(guān)的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 權(quán)限組:PHONE == 撥號(hào)相關(guān)的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 權(quán)限組:SMS == 短信相關(guān)的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- 權(quán)限組:STORAGE == 讀取存儲(chǔ)相關(guān)的權(quán)限申請(qǐng) --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
申請(qǐng)以上權(quán)限時(shí),除了要在清單文件中添加權(quán)限,還需要通過代碼動(dòng)態(tài)申請(qǐng)。
動(dòng)態(tài)權(quán)限核心函數(shù)
1. 檢測(cè)權(quán)限
checkSelfPermission(@NonNull String permission)
2. 申請(qǐng)權(quán)限
requestPermissions(@NonNull String[] permissions, int requestCode)
3. 處理結(jié)果回調(diào)
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
4. 是否需要顯示 UI 界面提示用戶為什么需要這個(gè)權(quán)限
shouldShowRequestPermissionRationale(@NonNull String permission)
簡(jiǎn)易實(shí)現(xiàn)案例
步驟1:在 AndroidManifest.xml 添加要申請(qǐng)的權(quán)限。這里以存儲(chǔ)權(quán)限為例
<!-- STORAGE == 讀取存儲(chǔ)相關(guān)權(quán)限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
步驟2:封裝一個(gè) requestPermission 方法來動(dòng)態(tài)檢測(cè)和申請(qǐng)權(quán)限
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(); }
requestPermission() 函數(shù)里會(huì)先檢測(cè)存儲(chǔ)權(quán)限,如果沒開啟則動(dòng)態(tài)申請(qǐng)存儲(chǔ)權(quán)限。
private void requestPermission() { // checkSelfPermission() 檢測(cè)權(quán)限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //TODO 申請(qǐng)存儲(chǔ)權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } }
注意:這個(gè) demo 里只申請(qǐng)了一個(gè)權(quán)限,當(dāng)我們需要申請(qǐng)多個(gè)權(quán)限時(shí),可以往requestPermissions 里的第二個(gè)參數(shù)添加其它需要的權(quán)限,因?yàn)樗揪褪且粋€(gè) String 數(shù)組,且也要在 AndroidManifest里添加。
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE ,Manifest.permission.CAMERA}
步驟3:處理用戶選擇的結(jié)果(“允許” / “拒絕”),重寫 onRequestPermissionsResult()方法。
//TODO 處理權(quán)限結(jié)果回調(diào) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { //用戶點(diǎn)擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED) if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i("TAG", "onRequestPermissionsResult granted"); } else { Log.i("TAG", "onRequestPermissionsResult denied"); // TODO 用戶拒絕權(quán)限申請(qǐng),則彈出警示框 showWaringDialog(); } } }
步驟4:當(dāng)用戶拒絕權(quán)限,則彈出警示框,并在用戶點(diǎn)擊“確定”后直接退出頁面。因?yàn)闆]有存儲(chǔ)權(quán)限肯定不能使用該應(yīng)用的。
/** * 用戶拒絕權(quán)限的警示 */ private void showWaringDialog() { new AlertDialog.Builder(this) .setTitle("警告!") .setMessage("請(qǐng)前往設(shè)置->應(yīng)用->權(quán)限管理->打開存儲(chǔ)權(quán)限,否則無法正常使用!") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO 一般情況下如果用戶不授權(quán)的話,功能時(shí)無法運(yùn)行的,則直接退出 finish(); } }).show(); }
完整代碼
MainActivity.java
package com.example.dynamicauthority; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 999; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(); } private void requestPermission() { // checkSelfPermission() 檢測(cè)權(quán)限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //TODO 申請(qǐng)存儲(chǔ)權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } } //TODO 處理權(quán)限結(jié)果回調(diào) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { //用戶點(diǎn)擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED) if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i("TAG", "onRequestPermissionsResult granted"); } else { Log.i("TAG", "onRequestPermissionsResult denied"); // TODO 用戶拒絕權(quán)限申請(qǐng),則彈出警示框 showWaringDialog(); } } } /** * 用戶拒絕權(quán)限的警示 */ private void showWaringDialog() { new AlertDialog.Builder(this) .setTitle("警告!") .setMessage("請(qǐng)前往設(shè)置->應(yīng)用->權(quán)限管理->打開存儲(chǔ)權(quán)限,否則無法正常使用!") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO 一般情況下如果用戶不授權(quán)的話,功能時(shí)無法運(yùn)行的,則直接退出 finish(); } }).show(); } }
到此這篇關(guān)于Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解的文章就介紹到這了,更多相關(guān)Android動(dòng)態(tài)權(quán)限申請(qǐng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
- Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限
- android6.0權(quán)限動(dòng)態(tài)申請(qǐng)框架permissiondispatcher的方法
- Android 6.0動(dòng)態(tài)權(quán)限申請(qǐng)教程
- Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題小結(jié)
- Android中不支持動(dòng)態(tài)申請(qǐng)權(quán)限的原因
相關(guān)文章
Android開發(fā)中TextView 實(shí)現(xiàn)右上角跟隨文本動(dòng)態(tài)追加圓形紅點(diǎn)
這篇文章主要介紹了android textview 右上角跟隨文本動(dòng)態(tài)追加圓形紅點(diǎn)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11解決在eclipse中將android項(xiàng)目生成apk并且給apk簽名的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)在eclipse中將android項(xiàng)目生成apk并且給apk簽名的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android模擬美團(tuán)客戶端進(jìn)度提示框
這篇文章主要為大家詳細(xì)介紹了Android模擬美團(tuán)客戶端進(jìn)度提示框的實(shí)現(xiàn)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09Android開發(fā):淺談MVP模式應(yīng)用與內(nèi)存泄漏問題解決
本篇文章主要介紹了Android開發(fā):MVP模式應(yīng)用與內(nèi)存泄漏問題解決,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11Android PopupWindow實(shí)現(xiàn)微信右上角的彈出菜單
這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實(shí)現(xiàn)微信右上角的彈出菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android編程滑動(dòng)效果之Gallery仿圖像集瀏覽實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程滑動(dòng)效果之Gallery仿圖像集瀏覽實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Gallery瀏覽圖片的原理、步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-02-02Android開發(fā)之Android.mk模板的實(shí)例詳解
這篇文章主要介紹了Android開發(fā)之Android.mk模板的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問題
今天小編就為大家分享一篇關(guān)于Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12android異步請(qǐng)求服務(wù)器數(shù)據(jù)示例
這篇文章主要介紹了android異步請(qǐng)求服務(wù)器數(shù)據(jù)示例,需要的朋友可以參考下2014-03-03