当前位置: 首页 > news >正文

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

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

 

 

 

转载于:https://www.cnblogs.com/xiaoliao/p/8616964.html

相关文章:

  • svm资料收集
  • java学习--基础知识第四天--笔记
  • WPF中自定义MarkupExtension
  • 省选专练CQOI2015网络吞吐量
  • 博客作业2---线性表
  • spring-boot jpa mysql emoji utfmb4 异常处理
  • list.FindAll of C#
  • 关于emgucv控制多摄像头问题
  • 一分钟上手, 让 Golang 操作数据库成为一种享受
  • 逆序对问题
  • 14.boost最小生成树 kruskal_min_spainning_tree
  • CAP原则(CAP定理)、BASE理论
  • Google I/O 2014 大会总结 Android开发新方向
  • 模板中可以直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:...
  • 预防定时重启apache服务没有起来的脚本
  • golang 发送GET和POST示例
  • JS变量作用域
  • leetcode388. Longest Absolute File Path
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • REST架构的思考
  • win10下安装mysql5.7
  • 人脸识别最新开发经验demo
  • 试着探索高并发下的系统架构面貌
  • 手写双向链表LinkedList的几个常用功能
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 自制字幕遮挡器
  • k8s使用glusterfs实现动态持久化存储
  • puppet连载22:define用法
  • Semaphore
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #传输# #传输数据判断#
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.proxy和$.extend
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4.10~4.16)
  • (6)设计一个TimeMap
  • (Java数据结构)ArrayList
  • (pojstep1.3.1)1017(构造法模拟)
  • (Python第六天)文件处理
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Mysql的优化设置
  • (转)大道至简,职场上做人做事做管理
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **python多态
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net操作Excel出错解决
  • .net中我喜欢的两种验证码