2023一些新的东西
动态权限依赖android.support.v4
包(Eclipse),当然老的v4包也可能没有。
在AndroidStudio中依赖com.android.support:appcompat-v7
包。
动态权限主要使用三个接口
- 检查是否拥有权限
1
2
3
4
5
6ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
// 返回同意或不同意
// PackageManager.PERMISSION_GRANTED(0)同意
// PackageManager.PERMISSION_DENIED(-1)拒绝 - 申请权限
1
2
3// 可以申请一个或多个权限
ActivityCompat.requestPermissions(context,
newString[]{Manifest.permission.CAMERA}, 0); - 是否需要向用户解释什么是需要向用户解释?
1
ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)
在部分安卓手机中如果申请权限后被用户明确拒绝过并且不允许再次询问后,就需要向用户解释为什么需要权限,然后引导用户到设置自行打开权限。
完整流程如下:
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
public static void RequestCameraPermission(){
if(Build.VERSION.SDK_INT >= 23 && activity.getApplicationInfo().targetSdkVersion>=23){
activity.runOnUiThread(new Runnable() {
public void run() {
final SweetDialog dialog =new SweetDialog(activity);
dialog.setTitle("“XXXX”想要访问你的相机");
dialog.setContent("如果不允许,您将无法拍摄照片,也无法正常使用YYY功能。");
dialog.setPositiveButton("确定", new View.OnClickListener() {
public void onClick(View v) {
if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
// 拒绝权限并且点了不允许弹出
OpenAppSetting();
}else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},1);
}
dialog.dismiss();
}
});
dialog.setNegativeutton("拒绝", new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
}
}
1 | public static void RequestCameraPermission(){ |
下面内容N年前了,有些老旧
前言
在之前一篇关于高德定位错误总结的博客中,遇到在Android版本达到6.0+时对于一些危险权限用户手动授予,没有动态申请就会出现软件不能使用的问题,所以写出这篇博客解决动态申请权限的问题。
Android 6.0+ (SDK 版本号大于23后)对于普通权限可以在AndroidMinifest.xml文件中可以直接使用,而对于那些危险权限(如:定位权限,通话,发送短信等)需要动态申请权限;
下面是一个通过高德定位的案例
MainActivity中:
1 | //初始化定位 |
CheckPermission.java
1 | public class CheckPermission extends Activity { |
AndroidMinifest.xml
1 | <!-- 需要运行时注册的权限 --> |