一、前提須知:
Android現在將所有的權限歸為了兩類,一類是普通權限,一類是危險權限,對于普通權限,系統會自動幫我們進行授權,不需要手動操作,對于危險權限,必須要由用戶手動進行點擊授權才可以,否則程式無法完成相應的功能,
Android 6.0系統中加入了運行時權限功能,在使用程序中再對危險權限進行授權,羅列Android中所有的危險權限,一共是9組24個權限,如圖:

二、第三方庫EasyPermissions使用步驟:
EasyPermissions庫是一個方便開發者為App高效處理危險權限的庫,可用于在Android M或者更高版本上
第一步:依賴:implementation 'pub.devrel:easypermissions:2.0.1'
第二步:在清單檔案里注冊的權限:
a <!--外部存盤的讀取權限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--外部存盤的寫入權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
b <uses-permission android:name="android.permission.CAMERA" />
c <!-- Android6.0 藍牙掃描也需要 允許一個程式訪問WiFi或移動基站的方式來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--Android6.0 藍牙掃描也需要 允許一個程式訪問精良位置(如GPS)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
等等權限(需要其他的再添加),
第三步:檢測權限的工具類及方法
public final class CheckPermissionUtils {
private CheckPermissionUtils() {
}
//需要申請的權限
private static String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.BLUETOOTH,
Manifest.permission.ACCESS_COARSE_LOCATION ,
Manifest.permission.ACCESS_FINE_LOCATION
};
//檢測權限
public static String[] checkPermission(Context context){
List<String> data = new ArrayList<>();//存盤未申請的權限
for (String permission : permissions) {
//Android自帶的檢測權限的方法:checkSelfPermission()
int checkSelfPermission = ContextCompat.checkSelfPermission(context, permission);
if(checkSelfPermission == PackageManager.PERMISSION_DENIED){//未申請
data.add(permission);
}
}
return data.toArray(new String[data.size()]);
}
}
第四步:檢測權限:
//1.1檢查權限
String[] permissions = CheckPermissionUtils.checkPermission(this);
第五步:申請權限
if (permissions.length == 0) {
//權限都申請了
//做接下來其他的事,比如是否登錄
} else {
//1.2申請權限 第2個引數 : 一些系列的權限; 第3個引數:這次請求權限的唯一標示,
ActivityCompat.requestPermissions(this, permissions, 100);
Log.i("ningc", "1.2申請權限requestPermissions:" );
}
第六步:實作EasyPermissions.PermissionCallbacks介面,重寫請求權限方法
//1.3.1 實作EasyPermissions.PermissionCallbacks介面,重寫請求權限成功方法
/**
* 請求權限成功,
* 可以彈窗顯示結果,也可執行具體需要的邏輯操作
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Toast.makeText(this, "執行onPermissionsGranted()...", Toast.LENGTH_SHORT).show();
Log.i("ningc", "1.3.1onPermissionsGranted" );
}
//1.3.1 實作EasyPermissions.PermissionCallbacks介面,重寫請求權限失敗方法
/**
* 請求權限失敗
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Toast.makeText(this, "執行onPermissionsDenied()...", Toast.LENGTH_SHORT).show();
Log.i("ningc", "1.3.1onPermissionsDenied:請求權限失敗" );
/**
* 1.5.1 若是在權限彈窗中,用戶勾選了“不再詢問(NEVER ASK AGAIN.)”或者“不在提示”,且拒絕權限,
* 這時候,需要跳轉到設定界面去,讓用戶手動開啟,沒勾選則不會跳轉到設定界面,
*/
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this)
.setTitle("權限申請")
.setRationale("當前App需要申請camera權限,需要打開設定頁面么?")
.setPositiveButton("確認")
.setNegativeButton("取消")
.setRequestCode(REQUEST_CAMERA_PERM)
.build()
.show();
Log.i("ningc", "1.5.1 跳轉到設定界面去,讓用戶手動開啟" );
}
}
第七步:重寫onRequestPermissionsResult,用于接受請求結果
//1.3.2 重寫onRequestPermissionsResult,用于接受請求結果
/**
* 重寫onRequestPermissionsResult,用于接受請求結果
* 在1.2請求后,彈出系統權限彈窗,剩下是用戶是否授權操作,權限結果是回呼在Activity
* 或者Fragment中的重寫的onRequestPermissionsResult()方法中,
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//將請求結果傳遞EasyPermission庫處理
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
Log.i("ningc", "1.3.2重寫onRequestPermissionsResult,用于接受請求結果" );
}
第八步:(可選則實作或者不實作)@AfterPermissionGranted注解
//1.4 @AfterPermissionGranted注解
@AfterPermissionGranted(REQUEST_CAMERA_PERM)
public void cameraTask(int viewId) {
Log.i("ningc", "1.4cameraTask" );
if (EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA)) {
// Have permission, do the thing!
// performClick(viewId);
} else {
// Ask for one permission
EasyPermissions.requestPermissions(this, "需要請求camera權限",
REQUEST_CAMERA_PERM, Manifest.permission.CAMERA);
}
}
第九步:若是在權限彈窗中,用戶勾選了“不再詢問(NEVER ASK AGAIN.)”或者“不在提示”,且拒絕權限, 這時候,需要跳轉到設定界面去,讓用戶手動開啟,沒勾選則不會跳轉到設定界面,
/**
* 1.5.1 若是在權限彈窗中,用戶勾選了“不再詢問(NEVER ASK AGAIN.)”或者“不在提示”,且拒絕權限,
* 這時候,需要跳轉到設定界面去,讓用戶手動開啟,沒勾選則不會跳轉到設定界面,
*/
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this)
.setTitle("權限申請")
.setRationale("當前App需要申請camera權限,需要打開設定頁面么?")
.setPositiveButton("確認")
.setNegativeButton("取消")
.setRequestCode(REQUEST_CAMERA_PERM)
.build()
.show();
Log.i("ningc", "1.5.1 跳轉到設定界面去,讓用戶手動開啟" );
}
第十步:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CAMERA_PERM) {
//1.5.2從設定頁面處理權限后回傳(可能勾選對應權限,也可沒勾選上)
Toast.makeText(this, "從設定頁面回傳...", Toast.LENGTH_SHORT).show();
Log.i("ningc", "1.5.2requestCode:"+requestCode );
Log.i("ningc", "1.5.2從設定頁面處理權限后回傳" );
}
}
三、代碼執行流程:(此處不再附加,日志列印可看)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/7910.html
標籤:其他
