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

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. Spring Cloud基础教程

    Spring Cloud基础教程  2017-04-04 被围观 90375 次 该教程内容不定时更新,如您对这些内容感兴趣,可以关注我的博客或微信公众号! 本教程示例代码: GitHub:https ...

  2. Java_监听器监听文件夹变动

    package demo4; import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Path ...

  3. java二分法搜索

    二分法就是要将数据每次都分成两份然后再去找到你想要的数据 在二分法查找时要求传入的数据必须已经有序,假设现在为升序,然后每次将所寻找的值与中间值(数组左边界+(右边界-左边界)/2)作比较,大了则去寻 ...

  4. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

  5. HttpServletRequest 获取cookie

    request.getHeader("cookie") 得到的是a=b,c=d Cookie[] cookies = request.getCookies(); 访问方在heade ...

  6. Windows 窗体

    Windows系统,顾名思义,就是窗口系统,每一个程序都可以用窗口来展示,所以,为了展示窗口,需要多做一系列的工作,当然,也有纯控制台应用,就不用附带窗口了. 首先就是窗口程序的入口地址,与传统的in ...

  7. NetCore+MySql+EF 数据库生成实体模型

    NetCore版本    2.1 1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: MySql.Data.EntityFrame ...

  8. Ubuntu16.04 修改主机名,以及解析主机名

    第一步:修改主机名: vim  /etc/hostname 第二步:修改网络解析名称: vim /etc/hosts 第三步:重启网络配置服务(或者刷新dns): sudo /etc/init.d/n ...

  9. go语言语法基础

    1. go标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号 如:fmt.Println("hello world") 2.行分隔符 在 Go 程序中,一 ...

  10. 针对特定网站scrapy爬虫的性能优化

    在使用scrapy爬虫做性能优化时,一定要根据不同网站的特点来进行优化,不要使用一种固定的模式去爬取一个网站,这个是真理,以下是对58同城的爬取优化策略: 一.先来分析一下影响scrapy性能的set ...