日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android申请权限一次性申请多个,android 6.0以上动态一次申请多个权限-最美解决方案...

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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以上动态一次申请多个权限-最美解决方案...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。