Android動態(tài)權限申請實現(xiàn)步驟分解

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

