Android已申请动态权限报错,android 权限动态申请

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

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

那么需要在

124fdfd1c15d98424647d108466a244b.png

然后就可以了,

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

现在说一下

直接上程序吧

public voidcheckPermission()

{int targetSdkVersion = 0;

String[] PermissionString={Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.CAMERA};try{

final PackageInfo info= this.getPackageManager().getPackageInfo(this.getPackageName(), 0);

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,1);

}

}

}/**

* 检查是否拥有指定的所有权限*/

privateboolean checkPermissionAllGranted(String[] permissions) {for(String permission : permissions) {if (ContextCompat.checkSelfPermission(this, permission) !=PackageManager.PERMISSION_GRANTED) {//只要有一个权限没有被授予, 则直接返回 false//Log.e("err","权限"+permission+"没有授权");

return false;

}

}return true;

}//申请权限结果返回处理

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {

boolean isAllGranted= true;//判断是否所有的权限都已经授予了

for (intgrant : grantResults) {if (grant !=PackageManager.PERMISSION_GRANTED) {

isAllGranted= false;break;

}

}if(isAllGranted) {//所有的权限都授予了

Log.e("err","权限都授权了");

}else{//弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮//容易判断错//MyDialog("提示", "某些权限未开启,请手动开启", 1) ;

}

}

}

程序启动的时候检查权限

cd7606a98f7cf6050c30559cc3ba233d.png

现在说一下流程

7e3c4dc42f598603c033b6b077c95e5e.png

467076e1e0cf17d23fa0d7de1abab3b5.png

a258fca0a557681648853dad48eb1503.png

说一下,如果调用这个

6277c5b01fb5df0ce5cd1fd3d8417440.png

就会执行

a0656fede8c899c30ad3004c8c889c7a.png

private void MyDialog(final String str1, final String str2, final intindex) {

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(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

alertdialogbuilder.dismiss();

}

});

mButton2.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

alertdialogbuilder.dismiss();

Intent intent= newIntent();

intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");

intent.setData(Uri.fromParts("package", getPackageName(), null));

startActivity(intent);

}

});

}

f45aff0ed12520c1686b385f317ff832.png

应用设置界面

923d6d36f6c428f674295f92d279733e.png

然后就没了,

现在说一下BUG问题

大家百度

3f5a14d4dbbdf39c964d2dd685e73999.png

checkSelfPermission

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

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

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

7f33c5129abe310b3a6653ae050e22dd.png

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

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

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

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

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

82280549970176e50757965f90dec0b7.png

4bf0dbc93463ecb2a2ac3fd09a23d8c0.png

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

aa394196bf7b3ea930c4b3a0b5804f3b.png

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

100e10695cc8cc89d279407fe743fbfa.png

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

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

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

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

0fc5c185b855681e772f13cbb87f9539.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值