名字其实有点让人感觉高大上"权限动态申请",其实也没有什么,

以前做Android程序的时候,比如需要打开摄像头

那么需要在

然后就可以了,

但是Android6.0之后呢,有些权限必须手动让用户同意才可以,哪些权限需要用户手动同意,哪些不需要这里大家自行百度

现在说一下

直接上程序吧

public void checkPermission()
{
int targetSdkVersion = ;
String[] PermissionString={Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};
try {
final PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), );
targetSdkVersion = info.applicationInfo.targetSdkVersion;//获取应用的Target版本
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
// Log.e("err", "检查权限_err0");
} if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//Build.VERSION.SDK_INT是获取当前手机版本 Build.VERSION_CODES.M为6.0系统
//如果系统>=6.0
if (targetSdkVersion >= Build.VERSION_CODES.M) {
//第 1 步: 检查是否有相应的权限
boolean isAllGranted = checkPermissionAllGranted(PermissionString);
if (isAllGranted) {
//Log.e("err","所有权限已经授权!");
return;
}
// 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
ActivityCompat.requestPermissions(this,
PermissionString, );
}
}
} /**
* 检查是否拥有指定的所有权限
*/
private boolean checkPermissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则直接返回 false
//Log.e("err","权限"+permission+"没有授权");
return false;
}
}
return true;
} //申请权限结果返回处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == ) {
boolean isAllGranted = true;
// 判断是否所有的权限都已经授予了
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
// 所有的权限都授予了
Log.e("err","权限都授权了");
} else {
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
//容易判断错
//MyDialog("提示", "某些权限未开启,请手动开启", 1) ;
}
}
}

程序启动的时候检查权限

现在说一下流程

说一下,如果调用这个

就会执行

    private void MyDialog(final String str1, final String str2, final int index) {
android.support.v7.app.AlertDialog.Builder AlertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(MainActivity.this, R.style.MyDialog);
View mView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_config_button2, null); final TextView mTextView1 = mView.findViewById(R.id.tvdogcon1);
final TextView mTextView2 = mView.findViewById(R.id.tvdogcon2);
final Button mButton1 = mView.findViewById(R.id.btdogcon1);
final Button mButton2 = mView.findViewById(R.id.btdogcon2);
mButton2.setText("前去设置");
mButton2.setTextColor(Color.BLUE);
mButton1.setText("取消");
mButton1.setTextColor(Color.BLACK); mTextView1.setText(str1);
mTextView2.setText(str2); AlertDialogBuilder.setView(mView);//对话框加载视图 final android.support.v7.app.AlertDialog alertdialogbuilder = AlertDialogBuilder.create();
alertdialogbuilder.setCanceledOnTouchOutside(false);//点击外围不消失 alertdialogbuilder.show(); mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertdialogbuilder.dismiss(); }
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertdialogbuilder.dismiss();
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);
}
});
}

应用设置界面

然后就没了,

现在说一下BUG问题

大家百度

checkSelfPermission

总是返回 false  很多说这个问题的

这就导致一个问题,如果用户进入 应用设置界面 设置了允许对应的权限  然后回到程序,

结果...总是调用这个....这就太奇葩了

后来我发现,同时满足这两条条件再检测就不会了,可以准确的检查,

但是我重复安装了几次我的APP,还是有个奇怪的问题,前面我都拒绝,然后就会提示进入  应用管理界面

按理说默认应该是询问状态,,但是却是  显示的允许......然后发现必须自己重复点击一下拒绝,然后再点击一下允许

回到界面后才会正常........按理来说用户不会像我似的,因为我一直在调试

但是确实是一个问题.....

但是还有个问题,那天让一个朋友测试,发现另一个问题,,如果在安装的时候就修改,不允许任何权限,,那么安装完以后,也不会进入

所以最终决定,把这里屏蔽了

因为现在还不能准确的判断

以后判断呢只能是异常捕获了........

假如说,用户没有同意摄像头权限,然后执行摄像头的一些程序的时候肯定会报错

然后在异常捕获里提醒用户  跳转到应用权限管理里面去打开权限

android 权限动态申请的更多相关文章

  1. Android permission 动态申请、授权

    原文:Android permission 动态申请.授权 Android permission 新特性深度学习 本篇文章介绍android permission系统,并介绍android 6.0 p ...

  2. Android之动态申请权限(API23以上需求)

    API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...

  3. android6.0以上权限动态申请,有视频链接可以看效果。

    android6.0以上某些权限需要动态申请,虽然现在大多的手机系统版本在6.0,但是升级到6.0及以上是迟早的事,所以如何能够更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是需要 ...

  4. QT 安卓 悬浮窗权限动态申请

    一:申请方式: String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMI ...

  5. android:动态申请权限(一)

    环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...

  6. Android 动态申请权限问题【转】

    Android 动态申请权限问题 感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4 感谢大佬:https://blog.csdn.net/weixin_42910 ...

  7. Android适配API23之后权限的动态申请

    一.权限介绍 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要 ...

  8. Android权限之动态权限

    安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainf ...

  9. 说说Android6.0动态申请权限的那些坑

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...

随机推荐

  1. java.lang.IllegalArgumentException Expected MultipartHttpServletRequest

    解决方案:检查jar包,完毕无误后在Spring MVC的配置文件中加入: <!-- 需要文件上传功能时,启用以下配置 设置最大上传文件大小 10M=10*1024*1024(B)=104857 ...

  2. docker 安装软件

    Docker Docker官方网址: https://docs.docker.com/  英文地址 Docker中文网址: http://www.docker.org.cn/ 中文地址 Docker是 ...

  3. onkeypress 在js函数返回false后没有反应

    一.解决方案: 把 onkeypress = "function()" 改为 onkeypress = "event.returnValue=function()&quo ...

  4. LeanCloud数据存储相关问题

    1.短信验证码 当注册用户的时候,会发现收不到短信验证码,打印e : That operation isn't allowed for clients. 含义 - 该操作无法从客户端发起.请检查该错误 ...

  5. 项目开发常见字符串处理模型-strstr-while/dowhile模型

    strstr-whiledowhile模型用于在母字符串中查找符合特征的子字符串. c语言库提供了strstr函数,strstr函数用于判断母字符串中是否包含子字符串,包含的话返回子字符串的位置指针, ...

  6. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  7. JdbcTemplate学习笔记(更新插入删除等)

    1.使用JdbcTemplate的execute()方法执行SQL语句 jdbcTemplate.execute("CREATE TABLE USER (user_id integer, n ...

  8. 常见问题--post发送参数使用httpservletrequest读取为空

    1)springcloud项目中使用request.getparameter读取参数为空 原因:使用restcontroller导致,之前为controller.而通过requestbody注解封装为 ...

  9. SQL alwayson 辅助接点查询统计信息“丢失”导致查询失败

    ALWAYSON 出现以下情况已经2次了,记录下: DBCC 执行完毕.如果 DBCC 输出了错误信息,请与系统管理员联系. 消息 2767,级别 16,状态 1,过程 sp_table_statis ...

  10. Asp.Net配置不允许通过url方式访问目录下的资源

    Asp.Net网站发布后,有部分文件为了安全性,是不能直接通过url访问获取 通常有2种做法: 1.将文件目录建立在 App_code 或者App_Data 等默认的隐藏目录下 2.将文件的目录添加到 ...