zoukankan      html  css  js  c++  java
  • android6.0以上权限动态申请,有视频链接可以看效果。

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

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

     

     
  • 相关阅读:
    IO操作之BIO、NIO、AIO
    IO之Socket网络编程
    this.getClass()和super.getClass()得到的是同一个类
    经济增长的背后
    SVN分支创建与合并
    .net类库里ListView的一个BUG
    VS2010调试技巧
    用C#代码编写的SN快速输入工具
    请教如何改善C#中socket通信机客户端程序的健壮性
    利用WebClient实现对Http协议的Post和Get对网站进行模拟登陆和浏览
  • 原文地址:https://www.cnblogs.com/xiaoliao/p/8616964.html
Copyright © 2011-2022 走看看