精华内容
下载资源
问答
  • Android6.0动态权限申请

    2017-01-11 22:35:18
    Android6.0动态权限申请Demo
  • android6.0动态权限申请

    2017-07-19 22:50:36
    android6.0动态权限在进入MainActivity之前集体申请,一条龙解决,使用方便,也可自己在当前模块在手动申请
  • 本文主要介绍了Android 6.0动态权限申请的教程,具有很好的参考价值。下面跟着小编一起来看下吧
  • 安卓6.0动态权限申请

    2019-03-08 20:48:40
    Google在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。应用的相关功能每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。 正常权限:不会直接给用户隐私权带来风险。如果...

    动态权限申请:
    Google在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。应用的相关功能每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。

    正常权限:不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。

    危险权限:会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。

    重要方法

    1.ContextCompat.checkSelfPermission()
    检查应用是否具有某个危险权限。如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIED,且应用必须明确向用户要求权限。
    2.ActivityCompat.requestPermissions()
    应用可以通过这个方法动态申请权限,调用后会弹出一个对话框提示用户授权所申请的权限。
    3.ActivityCompat.shouldShowRequestPermissionRationale()
    如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false。
    4.onRequestPermissionsResult()
    当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应,处理对应的场景。

    实例:
    写一个申请权限的工具类:

    package com.example.jiaho.baidumapproject;
    
    import android.app.Activity;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.support.annotation.NonNull;
    import android.support.annotation.RequiresApi;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //申请权限的工具类
    public class PermissionUtils {
        private Activity mActivity;
        private int mReqCode;
        private CallBack mCallBack;
    
        //定义一个回调接口
        public static interface CallBack{
            //接受
            void grantAll();
            //拒绝
            void denied();
        }
    
        //定义一个构造函数
        public PermissionUtils(Activity activity) {
            this.mActivity = activity;
        }
    
        //定义请求权限的方法
        @RequiresApi(api = Build.VERSION_CODES.M)
        public void request(List<String> needPermissions, int reqCode, CallBack callBack){
    
            mReqCode=reqCode;
            mCallBack=callBack;
    
            //因为6.0之后才需要动态权限申请
            if (Build.VERSION.SDK_INT < 23){
                //6.0之前是默认获取全部权限
                callBack.grantAll();
                return;
            }
    
            //判空,并抛出异常
            if (mActivity==null){
                throw  new IllegalArgumentException("activity is null.");
            }
    
    
            //将需要申请的权限,因为有些权限已经赋予
            List<String> reqPermission =new ArrayList<>();
            for (String permission:needPermissions){
                if (mActivity.checkSelfPermission(permission)!= PackageManager.PERMISSION_GRANTED){
                    reqPermission.add(permission);
                }
            }
    
            //如果没有要授予的权限,则直接返回
            if (reqPermission.isEmpty()){
                callBack.grantAll();
                return;
            }
    
            //真正开始申请
            mActivity.requestPermissions(reqPermission.toArray(new String[]{}),reqCode);
    
        }
    
        //处理权限返回的回调
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
            if (requestCode==mReqCode){
                boolean grantAll = true;
    
                //遍历每一个授权结果
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i]!=PackageManager.PERMISSION_GRANTED){
                        grantAll=false;
                        Toast.makeText(mActivity,permissions[i]+"未授权",Toast.LENGTH_SHORT).show();
                        break;
                    }
                }
    
                if (grantAll){
                    mCallBack.grantAll();
                }else {
                    mCallBack.denied();
                }
            }
        }
    }
    

    在Activity中的应用:

    package com.example.jiaho.baidumapproject;
    
    import android.Manifest;
    import android.content.Intent;
    import android.os.Build;
    import android.support.annotation.NonNull;
    import android.support.annotation.RequiresApi;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class SplashActivity extends AppCompatActivity {
    
        private static List<String> sNeedPermissions=new ArrayList<>();
    
        private PermissionUtils permissionUtils= null;
    
        //静态块中初始化所需要的权限
        static {
            sNeedPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
            sNeedPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
            sNeedPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE);
            sNeedPermissions.add(Manifest.permission.INTERNET);
            sNeedPermissions.add(Manifest.permission.READ_PHONE_STATE);
            sNeedPermissions.add(Manifest.permission.READ_SYNC_SETTINGS);
            sNeedPermissions.add(Manifest.permission.ACCESS_WIFI_STATE);
            sNeedPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            sNeedPermissions.add(Manifest.permission.CAMERA);
            sNeedPermissions.add(Manifest.permission.CHANGE_WIFI_STATE);
        }
    
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
            permissionUtils=new PermissionUtils(this);
    
            permissionUtils.request(sNeedPermissions, 100, new PermissionUtils.CallBack() {
                @Override
                public void grantAll() {
                    toMainActivity();
                    finish();
                }
    
                @Override
                public void denied() {
                    fileList();
                }
            });
    
        }
    
    
        public void toMainActivity(){
            //进入主Activity
            startActivity(new Intent(SplashActivity.this,MainActivity.class));
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            permissionUtils.onRequestPermissionsResult(requestCode,permissions,grantResults);
        }
    }
    
    展开全文
  • Android 6.0 动态权限申请 不多说直接上代码(以定位权限为基准) if (Build.VERSION.SDK_INT < 23) { return; } if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != ...

    Android 6.0 动态权限申请
    不多说直接上代码(以定位权限为基准)
    if (Build.VERSION.SDK_INT < 23) {
    return;
    }
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_DENIED) {
    //获取动态权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
    还需要在manifest里面声明权限
    uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION”/>

    展开全文
  • Android 6.0动态权限申请

    千次阅读 2019-03-15 11:15:57
    Android 6.0动态权限申请 我并不希望成为白求恩一样的人,如果我写的东西对你有用,那是我最大的荣幸,但是如果不是,请抱有一丝理解,因为我写博客的最终目的只是为了记录自己生活中的点点滴滴,仅此而已,当然,...

    Android 6.0动态权限申请

    特别感谢: https://www.jianshu.com/p/2fe4fb3e8ce0
    本文是在该文的基础上添加了类似自己的读后感才完成的。

    我并不希望成为白求恩一样的人,如果我写的东西对你有用,那是我最大的荣幸,但是如果不是,请抱有一丝理解,因为我写博客的最终目的只是为了记录自己生活中的点点滴滴,仅此而已,当然,我欢迎建议,我只是无视无脑的喷子而已。

    另外,今后的博客将都会附上思维导图,我个人是不太喜欢规范的= =,所以如果导图画的非常不规范,也请你能够谅解,我完全是按照更加便于自己整理逻辑为前提来画思维导图的,写博客的时候参考的网站链接也会放在思维导图中。

    概述

    android 6.0引入了权限申请机制,将所有的权限分成了正常权限和危险权限。应用的相关功能每次再使用危险权限是需要动态的申请并的到用户的授权才能使用。

    权限分类

    系统权限分为两类:正常权限和危险权限。

    – 正常权限不会直接给用户隐私带来风险。只要再配置文件中正常列出想要的这类权限,系统将会自动地赋予应用这类权限,并不会提示出相应的提示,不然不是累死,就现在这样几个权限都烦的要死,要是十几二十个,真的不是让人活了。

    – 危险权限会授予应用访问用户机密数据的权限,(说说用户还有所谓的隐私权,其实只是意思意思),如果你列出了危险权限,用户必须明确批准你的应用使用这些权限,也就是那些烦的要死的弹出确认权限窗口。(我好开心哦,被赋予了拥有保护自己隐私的权力呢= =)

    危险权限与权限组

    重要方法

    – ContextCompat.checkSelfPermission
    检查应用是否具有某个危险权限。如果应用具有此权限,方法将返回PackageManage.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回PackageManager.PERMISSION_DENIED,且应用必须明确向用户要求权限,

    – ActivityCompat.requestPermissions
    应用可以通过这个方法动态申请权限,调用后会弹出一个对话框提示用户授权所申请的权限。

    – ActivityCompat.shouldShowRequestPermissionRational
    如果应用之前请求过此权限但是用户拒绝了请求,此方法返回true。如果用户再过去拒绝了权限请求,并在权限请求系统对话框中选择了Don’t ask again选项,此方法将返回false。如果设备规范进制应用具有改权限,此方法也会返回false。
    相信大多数人都不会和我一样,看到这里还不清楚为什么sholuldShowRequestPermissionRational方法到底是什么作用吧= =,这个方法的作用就是为了在需要提示用户是否需要权限的时候进行进一步的判定,如果之前用户已经选择了“别TM再给我报这个弹窗了”,那么这个方法就会返回false,如果没有点击那个选择框,这个方法会返回true,那么这个弹窗在每次执行checkSelfPermission方法的时候都会不厌其烦的弹出来,用户体验极差,当然,一旦这个方法返回false时,在应用内将很难再获取对应的权限了,只能到手机设置中手动再赋予对应的权限。
    个人感觉这是最重要的抗麻烦的方法= =!!!!!

    – onRequestPermissionsResult
    当应用请求权限时,系统将向用户显示一个对话框。当用户相应时,系统将调用onRequestPermissionResult()方法,向其传递用户响应,处理对应的场景。

    处理流程思维导图

    Android6.0动态权限相关

    RxPermissions

    官方提供的方法在一次申请多个权限的时候代码逻辑写起来比较繁琐,于是有了RxPermissions。RxPermissions是使用Rxjava封装的第三方的权限申请库,他的特点是借助Rxjava的特性简化了权限申请的代码逻辑,使代码看起来简洁易读。具体的使用方法可以参看《RxPermissions获取运行时权限》,里面写的比较详细。

    展开全文
  • android6.0权限

    在项目中多次遇到权限申请的问题,随着6.0的越来越普遍,对权限的申请越来越严格,学会动态申请权限也变得十分重要了。
    一:在需要用到权限的地方,比如应用的初始页,sd卡操作等,添加代码
    例:询问获得读写sd卡的权限
    首先要在配置文件中添加权限

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    在用到的地方添加代码

    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
                    }

    在activity添加回调,类似OnActivityResult();

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               //TODO 进行下一步操作
            }

    多项权限申请,这个在使用腾讯地图的定位功能是遇到过,官方文档中给的方式为:

    Android 6.0系统在原有的AndroidManifest.xml声明权限的基础上新增了运行时权限动态检测,定位等权限也包含在其中。如果您的应用程序设置了 targetSdkVersion ≥ 23,则需要在调用定位功能前进行权限检查,权限检查的示例代码如下:

    if (Build.VERSION.SDK_INT >= 23) {
         String[] permissions = {
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };
    
        if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED)
        {
            requestPermissions(permissions, 0);
        }
    }

    用户选择允许或拒绝后,会回调onRequestPermissionsResult方法:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //可在此继续其他操作。
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
        }
    }
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,802
精华内容 3,920
关键字:

安卓6.0动态权限申请