android申请权限一次性申请多个,android 6.0以上动态一次申请多个权限-最美解决方案...
目錄
背景
危險權限
申請權限思路
申請權限流程
干貨
后續
一.背景
android23 API新增危險權限校驗,需要手動獲取:
二.危險權限:
日歷數據
android.permission-group.CALENDAR
android.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
相機
android.permission-group.CAMERA
android.permission.CAMERA
聯系人
android.permission-group.CONTACTS
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
位置
android.permission-group.LOCATION
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
麥克風
android.permission-group.MICROPHONE
android.permission.RECORD_AUDIO
電話
android.permission-group.PHONE
android.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
傳感器
android.permission-group.SENSORS
android.permission.BODY_SENSORS
短信
android.permission-group.SMS
android.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.RECEIVE_WAP_PUSH
android.permission.RECEIVE_MMS
android.permission.READ_CELL_BROADCASTS
存儲
android.permission-group.STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
三.申請權限思路
Android6.0 運行時權限,相關的方法主要有四個:
1、檢查是否授予權限
ContextCompat.checkSelfPermission(mContext, permissions[i])
返回的結果為PackageManager.PERMISSION_GRANTED(0)表示授予權限
2、請求權限
ActivityCompat.requestPermissions(WelcomeActivity.this, permissions, 1);
注:permissions為數組,單個的權限,傳new String[]{permission}參數, 1為requestCode,在權限回調中需要使用。
3、請求權限后的回調
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
4、判斷用戶拒絕權限是是否勾選don't ask again選項,若勾選需要客戶手動打開權限
ActivityCompat.shouldShowRequestPermissionRationale(WelcomeActivity.this, permissions[i])
注:ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 這個方法是在用戶拒絕權限后返回true。也就是說:用戶第一次點擊一個需要權限的地方,該方法返回false(因為用戶沒拒絕~),當用戶拒絕掉該權限,下次點擊此權限處,該方法會返回true。為true的時候,顯示對話框對該權限說明,并讓用戶選擇是否再次申請權限。當用戶拒絕權限并勾選don't ask again選項后,會一直返回false,并且 ActivityCompat.requestPermissions 不會彈出對話框,系統直接deny,并執行 onRequestPermissionsResult 方法
5、總結
①、檢查需要申請的權限狀態,將未授權的單獨保存到集合中;
②、集合為空,進入首頁(已全都授予權限),不為空,請求權限;
③、當用戶拒絕時,判斷是否勾選don't ask again,未勾選,重新申請權限,已勾選,跳過歡迎界面,進入主界面。
四.申請權限流程
A、在實際項目中,為了開發的方便,在歡迎界面,將常用的權限申請一次性申請,一般申請寫存儲卡、定位等權限。
申請權限分為兩類: ① 直接彈出權限框,允許或禁止操作 ② 到手機具體某個頁面設置。
B、在某個具體操作的時候(如:懸浮窗權限)再單獨進行權限判斷。
C、具體操作權限申請流程:
①、請求權限;
②、在請求回調中,當用戶拒絕時,需判斷是否勾選don't ask again,
未勾選,重新申請權限,
已勾選,跳轉到設置界面。
五、干貨
用戶是否禁止權限
private boolean mShowRequestPermission = true;
申請權限 -- 進入登錄頁面時申請權限
private void init_permission() {
if (getSdkVersionSix()) {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.RECORD_AUDIO};
List mPermissionList = new ArrayList<>();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(LogInAct.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.isEmpty()) {// 全部允許
mShowRequestPermission = true;
} else {//存在未允許的權限
String[] permissionsArr = mPermissionList.toArray(new String[mPermissionList.size()]);
ActivityCompat.requestPermissions(LogInAct.this, permissionsArr, 101);
}
}
}
權限提示框 ,如果點擊禁止且不勾選禁止訪問,則無線循環彈出申請框,哈哈,就是這么任性。
如果全部允許則正常操作。如果全部禁止且禁止訪問,點擊登錄按鈕時再校驗一遍,
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 101:
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判斷是否勾選禁止后不再詢問
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(LogInAct.this, permissions[i]);
if (showRequestPermission) {
init_permission();
return;
} else { // false 被禁止了,不在訪問
mShowRequestPermission = false;//已經禁止了
}
}
}
break;
}
}
點擊登錄按鈕時 ,獲取申請權限的結果 并且這里動態申請了“懸浮窗”的權限
1. 如何小于6.0 直接登陸
2. 申請懸浮窗權限,如果沒有,直接跳轉到具體頁面進行設置,完成后在onActivityResult 中判斷是否允許該權限
如果允許再次動態申請一次權限,上面如果點擊了全部禁止且勾選了禁止訪問請調用 getRequestPermission()方法,
自動跳轉到應用程序列表中讓用戶手動設置權限
if (getSdkVersionSix()) {
if (Settings.canDrawOverlays(LogInAct.this)) {
if (getRequestPermission().equals("1")) { // 如果等于1則登錄
init_IntentLogIn(getAccount(), getPwd());
}
} else {
Toast.makeText(this, R.string.login_canDrawOverlays, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivityForResult(intent, 2);
}
} else {
init_IntentLogIn(getAccount(), getPwd()); // 6.0以下直接登錄
}
判斷SDK是否在6.0以上
public boolean getSdkVersionSix() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
處理申請的懸浮窗和其他權限
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2) {
if (Settings.canDrawOverlays(LogInAct.this)) {
init_permission();
} else {
Toast.makeText(this, R.string.login_canDrawOverlays, Toast.LENGTH_SHORT).show();
}
} else if (requestCode == 3) {
init_permission();
}
}
申請權限后的操作
public String getRequestPermission() {
if (mShowRequestPermission) {
return "1";
} else {// 被禁止后提示用戶必須到設置中授權,跳轉到應用程序列表頁面
Toast.makeText(this, R.string.login_permission, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
startActivityForResult(intent, 3);
return "-1";
}
}
六、后續
工具類已出 ,代碼傳送門
七、遠程依賴
1.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.stf-android:Permissions:-SNAPSHOT'
}
2.maven
jitpack.io
https://jitpack.io
com.github.stf-android
Permissions
-SNAPSHOT
總結
以上是生活随笔為你收集整理的android申请权限一次性申请多个,android 6.0以上动态一次申请多个权限-最美解决方案...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 铜锅洋芋饭的做法 怎样做铜锅洋芋饭
- 下一篇: android root权限函数,and