0%

Android动态申请存储权限、短信权限

Android开发 动态申请存储权限、短信权限等的方式
软件首次安装在有新版本时,下载新版本出错,查看错误后发现是读写存储权限未授予,到设置中手动给权限后下载就会正常,解决方法就是动态申请存储权限,如下:

第一种方案:
1.XML中添加存储读写及短信权限

1
2
3
4
5
6
7
<!-- 修改或删除您的USB存储设备中的内容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--发送及接收读取短信的权限-->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

2.在合适界面添加获取权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class LoginActivity extends Activity {
//日志打印常量
private String TAG;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在onCreate方法这里调用来动态获取存储权限以及短信权限
getReadPermissions();
}

/**
* 权限的验证及处理,相关方法
*/
private void getReadPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED
| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS) | ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {//是否请求过该权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 10001);
} else {//没有则请求获取权限,示例权限是:存储权限和短信权限,需要其他权限请更改或者替换
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 10001);
}
} else {//如果已经获取到了权限则直接进行下一步操作
Log.e(TAG, "onRequestPermissionsResult");
}
}

}

/**
* 一个或多个权限请求结果回调
* 当点击了不在询问,但是想要实现某个功能,必须要用到权限,可以提示用户,引导用户去设置
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 10001:
for (int i = 0; i < grantResults.length; i++) {
// 如果拒绝获取权限
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判断是否勾选禁止后不再询问
boolean flag = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);
if (flag) {
getReadPermissions();
return;//用户权限是一个一个的请求的,只要有拒绝,剩下的请求就可以停止,再次请求打开权限了
} else { // 勾选不再询问,并拒绝
Toast.makeText(this, "请到设置中打开权限", Toast.LENGTH_LONG).show();
return;
}
}
}
// Toast.makeText(LoginActivity.this, "权限开启完成",Toast.LENGTH_LONG).show();
break;
default:
break;
}

}

第二种方案:
1.XML中添加存储读写权限

1
2
3
<!-- 修改或删除您的USB存储设备中的内容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.在合适界面添加获取权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class LoginActivity extends Activity {
//动态获取权限需要添加的常量
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在onCreate方法这里调用来动态获取权限
verifyStoragePermissions(this);
}

//被调用的方法
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

3.其它两篇关于权限的文章
Android 6.0 动态权限申请简单简洁优雅的处理方式 :

https://blog.csdn.net/lin_dianwei/article/details/79025324

Android 6.0(API 23)及其以上动态申请的权限与申请权限的方法:

https://blog.csdn.net/htwhtw123/article/details/76032997
————————————————
版权声明:本文为CSDN博主「yirj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yi_rui_jie/article/details/118176065