android6.0以上某些权限须要动态申请,虽然如今大多的手机系统版本在6.0,可是升级到6.0及以上是早晚的事,因此如何可以更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是须要花点时间认真思考的,下面就将个人实现思路、代码、视频贴出,但愿能帮助到看笔记的各位。html
思路:java
将须要动态申请的权限放入一个集合,在app启动时,判断 Build.VERSION.SDK_INT版本,当Build.VERSION.SDK_INT>22时,,遍历请求权限集合里的每个权限,判断是否有未针对本App,没有开启的权限,定一个int全局变量,当前遍历请求权限时,若是某一个遍历权限未开启,给int变量+1, 遍历完毕,判断int ,当int>1弹出一个提示框。android
这里用户若是点击取消,定义定义一个单例模式里的字段,来记录。好比咱们这里请求的Manifest.permission.READ_PHONE_STATE权限被用户拒绝了,那么你在接下去的代码中就不能去获取device_id,不然app直接崩。网络
若是用户点击了肯定,咱们调用一个方法,跳转到权限设置页面,让用户选择开启,跳转以后,你ap片须要动态申请到的权限都在,权限开启栏中。app
private void openAppPermissionSetting(int requestCode) { PrimmessIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + this.getPackageName())); PrimmessIntent.addCategory(Intent.CATEGORY_DEFAULT); builder=new AlertDialog.Builder(this); builder.setIcon( R.mipmap.temp_log); builder.setTitle("权限申请"); builder.setMessage("咱们须要申请一些权限,以便给你带来更好的体验!"); //监听下方button点击事件 builder.setPositiveButton("确 定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { try { startActivityForResult(PrimmessIntent, requestCode); PrimmessIntent=null; PrimmessOk=true; } catch (Throwable e) { } } }); builder.setNegativeButton("取 消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { PrimmessOk=false; Toast.makeText( LaunchActivity.this, "部分权限被拒绝获取,将会影响后续功能的使用,建议从新打开", Toast.LENGTH_LONG ).show(); isorNoStopPrimmess=isorNoStopPrimmess+1; LastMethord(); } }); //设置对话框是可取消的 builder.setCancelable(true); AlertDialog dialog=builder.create(); dialog.show(); }
重要:下面这一点很重要了,就是用户即便选择了肯定,跳转到权限设置里面了,他未设置开启权限,或则没有彻底开启怎么办,就返回了怎么办?
如上面的截图他只开了两个,其余三个不开启就返回了App怎么办ide
当用户从上面受权截图返回App时,咱们再遍历动态集合,看哪些未开启,若是这时还有未开启的权限,咱们就不能再弹框了,那样就会形成死循环,强行要求用户开启权限,这样确定是没法经过App商店审核的,并且用户体验也很差,这时咱们就作一个记录,以后别使用未申请的权限了, 以上的判断在onResume里面,而且要单独开一个线程不然报错,并且须要定义一个中介全局变量,当用户点击肯定时,设置一个值,以便用户返回时经过这个值来判断是否用户是从权限申请页里返回的!而且这时判断到还有未开启的权限时,咱们能够有好的提示一下用户:"Toast.makeText( LaunchActivity.this, "部分权限被拒绝获取,将会会影响后续功能的使用,建议从新打开", Toast.LENGTH_LONG ).show()",而后再继续执行代码。post
@Override public void onResume() { // TODO Auto-generated method stub super.onResume(); isorNoStopPrimmess=0; if(PrimmessOk) { PrimmessOk=false; RunLoadAndJumpHandle.post(judgeOpenPrimmessRunble); } } //关闭输入帐号窗口句柄 public Runnable judgeOpenPrimmessRunble = new Runnable() { public void run() { RunLoadAndJumpHandle.sendEmptyMessage(1); } } ; public Handler RunLoadAndJumpHandle = new Handler() { public void handleMessage(android.os.Message msg) { for (PermissionModel model : models) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(LaunchActivity.this, model.permission)) { if(ActivityCompat.shouldShowRequestPermissionRationale( LaunchActivity.this,model.permission )) { ActivityCompat.requestPermissions(LaunchActivity.this, new String[]{model.permission}, model.requestCode); } else { isorNoStopPrimmess= isorNoStopPrimmess+1; } } model=null; } if (isorNoStopPrimmess>0) { Toast.makeText( LaunchActivity.this, "部分权限被拒绝获取,将会会影响后续功能的使用,建议从新打开", Toast.LENGTH_LONG ).show(); } //OpenApp(); LastMethord(); } }; }
内容讲到这里,基本上就完了,下面有一个视频连接,有兴趣的能够去看下。须要完整代码能够加QQ:2819936788
<a href="https://v.qq.com/x/page/i0612llnhrl.html?ptag=qqbrowser">权限申请</a> 点击观看视频。</p>
https://v.qq.com/x/page/i0612llnhrl.html?ptag=qqbrowser
本人创业作的一款androidApp, 下载量已经有2000多万,各类当前热门的网络手机奖励红包所有集成,另外还有热门电影和淘宝高额优惠券!很适合各种型的用户。ui