开发者技术变现资源聚集地

https://www.baiydu.com

android6.0以上某些权限需要动态申请,虽然现在大多的手机系统版本在6.0,但是升级到6.0及以上是迟早的事,所以如何能够更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是需要花点时间认真思考的,下面就将我的实现思路、代码、视频贴出,希望能帮助到看笔记的各位。

思路:

将需要动态申请的权限放入一个集合,在app启动时,判断 Build.VERSION.SDK_INT版本,当Build.VERSION.SDK_INT>22时,,遍历请求权限集合里的每一个权限,判断是否有未针对本App,没有开启的权限,定一个int全局变量,当前遍历请求权限时,如果某一个遍历权限未开启,给int变量+1, 遍历完毕,判断int ,当int>1弹出一个提示框。

这里用户如果点击取消,定义定义一个单例模式里的字段,来记录。比如我们这里请求的Manifest.permission.READ_PHONE_STATE权限被用户拒绝了,那么你在接下去的代码中就不能去获取device_id,否则app直接崩。

如果用户点击了确定,我们调用一个方法,跳转到权限设置页面,让用户选择开启,跳转之后,你ap片需要动态申请到的权限都在,权限开启栏中。

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怎么办

解决方法:

      当用户从上面授权截图返回App时,我们再遍历动态集合,看哪些未开启,如果这时还有未开启的权限,我们就不能再弹框了,那样就会造成死循环,强行要求用户开启权限,这样肯定是无法通过App商店审核的,而且用户体验也不好,这时我们就做一个记录,之后别使用未申请的权限了,  以上的判断在onResume里面,并且要单独开一个线程否则报错,而且需要定义一个中介全局变量,当用户点击确定时,设置一个值,以便用户返回时通过这个值来判断是否用户是从权限申请页里返回的!并且这时判断到还有未开启的权限时,我们可以有好的提示一下用户:"Toast.makeText( LaunchActivity.this, "部分权限被拒绝获取,将会会影响后续功能的使用,建议重新打开", Toast.LENGTH_LONG ).show()",然后再继续执行代码。


@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多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。

 

 

android6.0以上权限动态申请,有视频链接可以看效果。的更多相关文章

  1. android 权限动态申请

    名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权 ...

  2. Android6.0获取权限

    照着<第一行代码>打代码,然并卵,感叹技术进步的神速.最后提醒一点:IT类的书籍一定要注意出版时间!出版时间!出版时间!重要的事情说三遍 问题出在android6.0的权限获取问题上,以前 ...

  3. 【Unity游戏开发】Android6.0以上的动态权限申请问题

    一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...

  4. Android6.0以上系统动态获取权限

    动态权限的申请方法: 1.首先,需要在AndroidManifest.xml静态申请权限,否则无法动态申请权限: <uses-permission android:name="andr ...

  5. 【Android开发】Android6.0请求权限方式

    记录一下最普通的动态请求权限的方法: private int requestCode == 123; //判断当前系统的版本 if(Build.VERSION.SDK_INT >= 23){ i ...

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

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

  7. Android6.0 危险权限和普通权限

    Normal Permissions如下 ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_NETWORK_STATE ACCESS_NOTIFICATION_POLICY ...

  8. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  9. Android6.0动态获取权限

    Android6.0采用新的权限模型,只有在需要权限的时候,才告知用户是否授权,是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权 ...

随机推荐

  1. 算法之Python实现 - 003 : 换钱的方法数

    [题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的方法数. [代码1]递归 impor ...

  2. 爬虫之进阶 twisted

    简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...

  3. 3G设置linux路由-iptables配置

    1.如何区分iptables的PREROUTING和POSTROUTING链 (引自http://jingyan.baidu.com/article/aa6a2c143d84470d4c19c4cf. ...

  4. 输入一段字符串,统计其中的数字,字母,空格,其他字符的方法 ----python---

    1.以简单的循环分支实现字符统计 str1 = input("输入字符串:") num=0;word=0;space=0;other=0; for i in str1: if i. ...

  5. form表单的三个属性 action 、mothod 、 enctype。

    form_action: 表单数据提交到此页面 下面的表单拥有两个输入字段以及一个提交按钮,当提交表单时,表单数据会提交到名为 "form_action.asp" 的页面: < ...

  6. del_cursor 批量删除游标

    declare   cursor [del_cursor] is select a.*, a.rowid row_id from [table_name] a order by a.rowid;   ...

  7. python——jieba分词过程

    import jieba """函数2:分词函数""" def fenci(training_data): ""&quo ...

  8. PCA降维参数介绍

    https://www.cnblogs.com/pinard/p/6243025.html#undefined

  9. 移动端与web端的测试点的差别

    单纯从功能测试的层面上来讲的话,APP 测试.web 测试 在流程和功能测试上是没有区别的.根据两者载体不一样,则区别如下:系统结构方面web项目,b/s架构,基于浏览器的:web测试只要更新了服务器 ...

  10. windows server 2012R2 故障转移集群配置

    配置说明: AD:10.10.1.10/24  Node-2:10.10.1.20/24 Node-3:10.10.1.30/24 zhangsan-PC:10.10.1.50/24  VIP1:10 ...