精华内容
下载资源
问答
  • 这个程序写了一个Android动态权限申请的模板,以后遇到其他权限申请可以直接套用。非常方便,若还需要危险权限表,请参考https://blog.csdn.net/qq_38367681/article/details/105737674
  • Android动态申请权限(一次申请多个动态权限) Android 6.0也就是API等级23之后,获取权限需要动态申请,否则程序无法正常使用。 录像需要多个权限,下面是一次申请多个权限的代码,单个权限申请也是差不多的: ...

    Android动态申请权限(一次申请多个动态权限)

    Android 6.0也就是API等级23之后,获取权限需要动态申请,否则程序无法正常使用。

    以录像功能为例,录像需要读写、相机和麦克风3个权限。下面是一次申请多个权限的代码,单个权限申请也是差不多的。另外,在用户禁止后弹出对话框引导用户跳转到设置界面去设置。

    package com.barrage.barragetest;
    
    import android.Manifest;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.provider.Settings;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        //录像需要的权限
        private static final String[] VIDEO_PERMISSIONS = {Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE};
        private static final int VIDEO_PERMISSIONS_CODE = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            requestPermission();
        }
    
        //申请权限
        private void requestPermission() {
            // 当API大于 23 时,才动态申请权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ActivityCompat.requestPermissions(MainActivity.this,VIDEO_PERMISSIONS,VIDEO_PERMISSIONS_CODE);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case VIDEO_PERMISSIONS_CODE:
                    //权限请求失败
                    if (grantResults.length == VIDEO_PERMISSIONS.length) {
                        for (int result : grantResults) {
                            if (result != PackageManager.PERMISSION_GRANTED) {
                                //弹出对话框引导用户去设置
                                showDialog();
                                Toast.makeText(MainActivity.this, "请求权限被拒绝", Toast.LENGTH_LONG).show();
                                break;
                            }
                        }
                    }else{
                        Toast.makeText(MainActivity.this, "已授权", Toast.LENGTH_LONG).show();
                    }
                    break;
            }
        }
    
        //弹出提示框
        private void showDialog(){
            AlertDialog dialog = new AlertDialog.Builder(this)
                    .setMessage("录像需要相机、录音和读写权限,是否去设置?")
                    .setPositiveButton("是", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            goToAppSetting();
                        }
                    })
                    .setNegativeButton("否", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    })
                    .setCancelable(false)
                    .show();
        }
    
        // 跳转到当前应用的设置界面
        private void goToAppSetting(){
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", getPackageName(), null);
            intent.setData(uri);
            startActivity(intent);
        }
    }
    
    

    另外还需要在AndroidManifest.xml中添加相应的权限:

    <!-- 相机权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 录音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 读写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    效果图,申请权限界面:
    在这里插入图片描述
    设置弹窗界面,点击跳转到该应用的设置页面:
    在这里插入图片描述

    展开全文
  • Android权限之动态权限

    千次阅读 2019-05-05 14:57:08
    安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将...

    安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将编译的目标版本设定这API 22,这样就可以了。但这并不是长久之计,不是吗?所以因此在这里学习一下。

    动态权限需求原因

    Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了,应用安装成功后就会被赋予清单文件中的所有权限,应用就可以在用户不知情的情况下进行非法操作(比如偷偷的上传用户数据)。

    需要动态申请的权限如下:

    READ_CALENDAR , WRITE_CALENDAR 读写日历权限
    CAMERA 调用相机权限
    READ_CONTACTS , WRITE_CONTACTS , GET_ACCOUNTS 通讯录权限
    ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 定位权限
    RECORD_AUDIO 录音权限
    READ_PHONE_STATE ,CALL_PHONE READ_CALL_LOG, WRITE_CALL_LOG ADD_VOICEMAIL//手机状态相关
    BODY_SENSORS 传感器权限
    SMS SEND_SMS ,RECEIVE_SMS ,READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS SMS消息权限
    READ_EXTERNAL_STORAGE ,WRITE_EXTERNAL_STORAGE 外部存储权限

    动态权限申请步骤

    AndroidMainfest.xml文件配置
    没有具体分析是什么原因,可能是为了兼容低版本吧,有兴趣的自行Google一下

    判断Android系统版本

    在官方的文档中,可以看到低于API23 是不需要使用动态权限申请的,我们需要判断一下,代码如下: 如果是Android 6.0以上的系统,需要进行判断,我们大致看一下

      if (Build.VERSION.SDK_INT>=23) {        
                //此处做动态权限申请    
        }
      else {      
            //低于23 不需要特殊处理   
         }
      }
    

    检查权限

    如果版本高于23 ,则需要进行特殊处理,我们这里检查一下有没有权限
    使用ContextCompat.CheckSlefPermission ,我们看看API解释,从源代码中找到这方法,我们来分析一下

    /** * Determine whether <em>you</em> have been granted a particular permission.
    * * @param permission The name of the permission being checked. 
    * * @return {@linkandroid.content.pm.PackageManager#PERMISSION_GRANTED} if you have the 
    * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not. 
    * * @see android.content.pm.PackageManager#checkPermission(String, String) */
    public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) 
    {  
      if (permission == null)
         {  
            throw new IllegalArgumentException("permission is null");  
         }   
     return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());}
    

    参数:一个上下文Context和一个权限的名称。
    返回:PERMISSION_GRANTED 存在权限以及PERMISSION_DENIED 不存在权限
    同时又调用了context.checkPermission方法,我们来看一下参数,拿到了一个String类型的数据,这个是权限的名称吗,以及当前进程的PID和UID,有兴趣额的可以继续深究

    申请权限

    如果发现CheckSelfPermission返回值是 PERMISSION_DENIED,则需要进行权限申请,我们这里看一下怎么申请的
    使用ContextCompat.CheckSlefPermission ,我们看看API解释,从源代码中找到这方法,我们来分析一下

    ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
    

    参数说明: 当前上下文。一个权限数组,还有一个唯一的请求码,注意这个请求码要大于0 ,低于65535,因为程序要求请求码只能是16位的数据,被坑了一次
    上下文就不说了,权限数组,说明是可以一次申请多个权限的,由于这个权限请求是异步操作的,所以说,用户判断权限后需要回调函数,那么就用到这个请求码了,好了,我们先来看看整体的逻辑代码

       if (Build.VERSION.SDK_INT>=23) {   
         int request=ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);      
            if (request!= PackageManager.PERMISSION_GRANTED)//缺少权限,进行权限申请      
              {            
                  ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},825638);            
                   return;//    
           }else 
               {       
                 //权限同意
              }
    
          }
      else
          { //低于23 不需要特殊处理,去掉用拍照的方法  }
    

    在这里插入图片描述

    回调函数的处理

    由于程序是异步操作,在用户完成了操作后,需要调用回调函数,而此回调函数则是一个Activity的放,因此重写Activity的方法

    //参数 requestCode是我们在申请权限的时候使用的唯一的申请码
    //String[] permission则是权限列表,一般用不到
    
    //int[] grantResults 是用户的操作响应,包含这权限是够请求成功
    
    //由于在权限申请的时候,我们就申请了一个权限,所以此处的数组的长度都是1
    
    @Override
    
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] 
    grantResults) {  
    
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
    
      if (requestCode==123)    {     
    
       //当然权限多了,建议使用Switch,不必纠结于此  
     
         if (grantResults[0]==PackageManager.PERMISSION_GRANTED) 
    
           {
    
                Toast.makeText(this, "权限申请成功", Toast.LENGTH_SHORT).show(); 
    
           }else if (grantResults[0]== PackageManager.PERMISSION_DENIED)        { 
    
               Toast.makeText(this, "权限申请失败,用户拒绝权限", Toast.LENGTH_SHORT).show(); 
    
           } 
    
       }
    
    }
    

    在这里插入图片描述
    在这里插入图片描述

    代码套餐

    代码比较简单,边学边写的,收获很大,以后要多写BLOG了,比自己看一遍理解更深,记得更牢靠

    package cn.wuhu.authority;
    import android.Manifest;
    import android.content.pm.PackageManager;import android.os.Build;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v4.content.PermissionChecker;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;import android.view.View;
    import android.widget.Toast;
    public class MainActivity extends AppCompatActivity {    
    @Override
     protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); 
           findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override
                public void onClick(View view) {
                    onTakePhoto();
                }
            });
        }
       public void onTakePhoto()   { 
          if (Build.VERSION.SDK_INT>=23)       {
               int request=ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
               if (request!= PackageManager.PERMISSION_GRANTED)//缺少权限,进行权限申请
               { 
                  ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},123);
                    return;//
               }
               else
               {
                   //权限同意,不需要处理,去掉用拍照的方法               Toast.makeText(this,"权限同意",Toast.LENGTH_SHORT).show();
               }
           }
      else{
               //低于23 不需要特殊处理,去掉用拍照的方法
           }
       }
        //参数 requestCode是我们在申请权限的时候使用的唯一的申请码 
       //String[] permission则是权限列表,一般用不到
        //int[] grantResults 是用户的操作响应,包含这权限是够请求成功
        //由于在权限申请的时候,我们就申请了一个权限,所以此处的数组的长度都是1
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode==123) 
           {            //当然权限多了,建议使用Switch,不必纠结于此
                if (grantResults[0]==PackageManager.PERMISSION_GRANTED)            {
                    Toast.makeText(this, "权限申请成功",Toast.LENGTH_SHORT).show();
                }else if (grantResults[0]== PackageManager.PERMISSION_DENIED)            { 
                   Toast.makeText(this, "权限申请失败,用户拒绝权限", Toast.LENGTH_SHORT).show();
                }
            } 
       }
    }
    
    
    展开全文
  • android 动态权限获取

    万次阅读 多人点赞 2018-02-09 15:24:00
    android 动态权限获取 至从android6.0之后,权限在清单文件AndroidManifest.xml里面申明都没有作用了,所以今天如果开发每一款app,都需要动态获取权限,那么我们将怎么动态获取权限呢?下面我举个列子我们需要获取...
    android 动态权限获取

            至从android6.0之后,权限在清单文件AndroidManifest.xml里面申明都没有作用了,所以今天如果开发每一款app,都需要动态获取权限,那么我们将怎么动态获取权限呢?下面我举个列子我们需要获取的权限有存储权限、电话权限、定位权限、相机权限。获取权限代码相对固定,复制粘贴就可以。只是贴出主要代码,大家注重思路即可。权限有些是在app内部调用相关功能的时候赋予权限,而有些是在一开始初始化就处理,我这里是后者。

    1、AndroidManifest.xml

    <!--存储权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--电话权限-->
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <!--相机权限-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <!--定位权限-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    2、MainActivity,一般权限实在引导页处理,但是因为性能问题,我就只写了一个MainActivity。但是都一样。

    (1)声明权限变量,以数组形式表示

    // 要申请的权限
    private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,
                                    Manifest.permission.CAMERA,Manifest.permission.ACCESS_COARSE_LOCATION};


    (2)onCreate生命周期里面进行判断是否拥有权限,可以写成循环,我只有几个权限就没有写了

    // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // 检查该权限是否已经获取
        int i = ContextCompat.checkSelfPermission(getApplicationContext(), permissions[0]);
        int l = ContextCompat.checkSelfPermission(getApplicationContext(), permissions[1]);
        int m = ContextCompat.checkSelfPermission(getApplicationContext(), permissions[2]);
        int n = ContextCompat.checkSelfPermission(getApplicationContext(), permissions[3]);
        // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
        if (i != PackageManager.PERMISSION_GRANTED || l != PackageManager.PERMISSION_GRANTED || m != PackageManager.PERMISSION_GRANTED ||
                n != PackageManager.PERMISSION_GRANTED) {
            // 如果没有授予该权限,就去提示用户请求
            
    startRequestPermission();
    
    }}

    (3)(2)中的提示用户请求的startRequestPermission()方法

    /**
     * 开始提交请求权限
     */
    private void startRequestPermission() {
        ActivityCompat.requestPermissions(this, permissions, 321);
    }

    (4)执行(3)以后,会有申请权限回调方法。回调方法如下

      /**
     * 用户权限 申请 的回调方法
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 321) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                     //如果没有获取权限,那么可以提示用户去设置界面--->应用权限开启权限
                } else {
                    //获取权限成功提示,可以不要
                    Toast toast = Toast.makeText(this, "获取权限成功", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            }
        }
    }

    至此,动态获取权限就已经ok了,但是如果我们要提示用户去应用设置手动开启权限的话,我再把代码补充一下,只演示一种存储权限未开启的情况

    (5)那么(4)的写法应该是

      /**
     * 用户权限 申请 的回调方法
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 321) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                       // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
                        boolean b = shouldShowRequestPermissionRationale(permissions[0]);
                        // 以前是!b
                        if (b) {
                        // 用户还是想用我的 APP 的
                        // 提示用户去应用设置界面手动开启权限
                            showDialogTipUserGoToAppSettting();
                        } else{
                            finish();
                        }
                } else {
                    //获取权限成功提示,可以不要
                    Toast toast = Toast.makeText(this, "获取权限成功", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            }
        }
    }


    (6)showDialogTipUserGoToAppSettting()

     /**
     * 提示用户去应用设置界面手动开启权限
     */
    private void showDialogTipUserGoToAppSettting() {
    
        dialog = new AlertDialog.Builder(this)
                .setTitle("存储权限不可用")
                .setMessage("请在-应用设置-权限-中,允许应用使用存储权限来保存用户数据")
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 跳转到应用设置界面
                        goToAppSetting();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
    //                        finish();
                    }
                }).setCancelable(false).show();
    }


    (7)goToAppSetting()

    /**
         * 跳转到当前应用的设置界面
         */
        private void goToAppSetting() {
            Intent intent = new Intent();
    
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", getPackageName(), null);
            intent.setData(uri);
    
            startActivityForResult(intent, 123);
        }

    (8)去应用设置里面的对权限设置的回调方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //权限管理
        if (requestCode == 123) {
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 检查该权限是否已经获取
                int i = ContextCompat.checkSelfPermission(this, permissions[0]);
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                if (i != PackageManager.PERMISSION_GRANTED) {
                    // 提示用户应该去应用设置界面手动开启权限
                    showDialogTipUserGoToAppSettting();
                } else {
                    if (dialog != null && dialog.isShowing()) {
                        dialog.dismiss();
                    }
                    Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    至此提示用户去设置界面手动开启存储功能就实现了

    展开全文
  • Qt for android 动态权限申请工具类
  • Android 动态权限最全解析

    万次阅读 2020-05-02 11:12:44
    本文目录动态权限概述动态权限分类动态权限申请方法方法1:官方API提供的方法步骤1:检查是否有权限步骤2:申请权限步骤3:回调函数的处理完整代码方法2:RxPermission引入依赖声明权限申请单个权限申请多个权限方法...

    在这里插入图片描述
    在这里插入图片描述

    动态权限概述

    Android6.0 开始,Google调整了应用的权限申请方案。调整之后将权限分级,分成了普通权限危险权限,普通权限的授权方式跟之前一样,只需要在Manifest文件中申明即可,危险权限不仅需要在Manifest文件中声明,还需要在程序中调用官方提供的Api主动申请。

    动态权限分类

    Android6.0 以后,一共将动态权限分成了9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。这九组权限分别如下:

    权限组名称权限组权限组权限成员
    读写联系人group:android.permission-group.CONTACTSpermission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS
    电话group:android.permission-group.PHONEpermission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL
    日历信息group:android.permission-group.CALENDARpermission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR
    相机group:android.permission-group.CAMERApermission:android.permission.CAMERA
    传感器group:android.permission-group.SENSORSpermission:android.permission.BODY_SENSORS
    地理位置group:android.permission-group.LOCATIONpermission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION
    存储卡group:android.permission-group.STORAGEpermission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE
    多媒体group:android.permission-group.MICROPHONEpermission:android.permission.RECORD_AUDIO
    SMSgroup:android.permission-group.SMSpermission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS

    动态权限申请方法

    方法1:官方API提供的方法

    步骤1:检查是否有权限

    由于低于API 23 是不需要使用动态权限申请的,我们需要先判断一下系统版本,代码如下是Android 6.0以上的系统还是Android 6.0以下的系统。用ContextCompat类中的checkSelfPermission方法进行是否有权限判断。

    public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
        if (permission == null) {
            throw new IllegalArgumentException("permission is null");
        }
    
        return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
    }
    

    具体使用方法如下:

    if (Build.VERSION.SDK_INT >= 23) {
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                  != PackageManager.PERMISSION_GRANTED) {
                  //无该权限,需要申请
          }
    } else { //低于23 不需要处理
    
    }
    

    步骤2:申请权限

    在步骤的的checkSelfPermission方法中如果判断没有权限,就需要用到ActivityCompat类中的requestPermissions方法进行动态权限申请,该方法需要传一个需要申请权限名称的权限permissions数组。

    public static void requestPermissions(final @NonNull Activity activity,
             final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
    }
    

    申请方法如下:先定一个需要申请权限的权限数组PERMISSIONS_STORAGE

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"};
    ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
    

    步骤3:回调函数的处理

    由于权限申请是异步的,用户完成了以后,需要回调函数处理,
    Activity中提供了一个回调处理方法onRequestPermissionsResult,只需要重写该方法即可
    case 中的参数REQUEST_EXTERNAL_STORAGE 即步骤2申请权限中定一个的参数

     @Override
     public void onRequestPermissionsResult(int requestCode,
                                            String permissions[], int[] grantResults) {
         switch (requestCode) {
             case REQUEST_EXTERNAL_STORAGE: {
                 if (grantResults.length > 0
                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();
                 } else {
                     Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();
                 }
             }
    
         }
     }
    

    完整代码

    在这里插入图片描述

    我们以申请SD卡读写权限为例,完整代码如下:

    public class MainActivity extends AppCompatActivity {
    
        private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (Build.VERSION.SDK_INT >= 23) {
                checkPermission();
            }
        }
    
    
        private void checkPermission() {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
                        .WRITE_EXTERNAL_STORAGE)) {
                    Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();
                }
                //申请权限
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
    
            } else {
                Toast.makeText(this, "已授权成功!", Toast.LENGTH_SHORT).show();
                dothings();
            }
        }
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case REQUEST_EXTERNAL_STORAGE: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        dothings();
                        Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();
                    }
                }
    
            }
        }
    
        public void dothings() {
    
        }
    }
    

    AndroidManifest.xml声明权限

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

    方法2:RxPermission

    RxPermission 可以帮助开发者简化获取权限的相关处理操作,而且内部也自动帮我们判断了版本是否需要申请权限。同时结合RxJava可以方便的回调各种结果。
    官网:https://github.com/tbruyelle/RxPermissions

    引入依赖

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
     
    dependencies {
        implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
         implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
        implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    }
    

    由于rxpermissions需要用到rxjava,所有rxjava的包也一起引入。

    声明权限

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

    申请单个权限

    RxPermissions permissions = new RxPermissions(this);
    permissions.request(Manifest.permission.CAMERA)
           .subscribe(new Consumer<Boolean>() {
               @Override
               public void accept(Boolean aBoolean)  {
                   if (aBoolean ) {
                       Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_SHORT).show();
                   }else {
                       Toast.makeText(MainActivity.this, "授权失败!", Toast.LENGTH_SHORT).show();
                   }
               }
           });
    
    

    申请多个权限

    RxPermissions permissions = new RxPermissions(this);  
    permissions.request(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE)
      .subscribe(new Consumer<Boolean>() {
                @Override
                public void accept(Boolean aBoolean)  {
                    if (aBoolean ) {
                        Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(MainActivity.this, "授权失败!", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    

    方法3:AndPermission

    AndPermission跟前面的RxPermission使用方法类似
    官网:https://github.com/yanzhenjie/AndPermission

    引入依赖

    implementation 'com.yanzhenjie:permission:2.0.3'
    

    申请单个或多个权限

     AndPermission.with(this)
                .runtime()
                .permission(Permission.WRITE_EXTERNAL_STORAGE,Permission.CAMERA)
                .onGranted(permissions -> {
                    Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_SHORT).show();
                })
                .onDenied(permissions -> {
                    Toast.makeText(MainActivity.this, "授权失败!", Toast.LENGTH_SHORT).show();
                })
                .start();
    

    效果如下:在这里插入图片描述

    展开全文
  • 之前调研了动态权限的申请方法,可是国内rom千奇百怪,真正实施起来的时候却不见得那么顺利,以前我们在Application里面承载了太多了业务逻辑,其中包含了需要READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE权限的操作,...
  • Django Vue实现动态菜单、动态权限

    千次阅读 2019-07-27 22:30:42
    随着前后端分离架构的流行,在 web 应用中,RESTful API 几乎已经成为了开发者主要选择,它使得客户端和服务端不需要保存对方的详细信息,也就是无状态性,但是这样在项目中需要动态菜单和动态权限就困难起来,本场...
  • springboot springsecurity动态权限控制,实现数据库动态管理菜单权限
  • SpringSecurity实现完整动态权限菜单 在实际开发中,开发任何一套系统,基本都少不了权限管理这一块。这些足以说明权限管理的重要性。其实SpringSecurity去年就学了,一直没有时间整理,用了一年多时间了,给我的...
  • Android动态权限申请

    千次阅读 2018-05-01 13:45:57
    在Android 6.0以上的系统,我们可以通过动态权限,来获取是否拥有某一权限,也可以动态申请权限。 private void checkPermission() { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CO...
  • Android 设置动态权限

    千次阅读 2019-07-11 15:35:18
    android6.0以上,需要动态申请权限,下面是添加动态权限的死代码,复制黏贴既可用,需要什么权限就添加更改即可。 一、申请多个权限,定义用到的参数和数组 String[] permissions = new String[]{Manifest.permiss...
  • Android 动态权限机制详解

    千次阅读 2019-07-31 15:47:45
    Android 动态权限机制详解一.权限系统(一)6.0之前(二)6.0之后(三)8.0二.兼容适配(一)TargetSdkVersion(二)适配方法1.检查权限2.请求权限3.请求权限的结果4.适当的提示5.Fragment的权限请求6.流程图总结 一.权限系统 ...
  • Android 6.0: 动态权限管理的解决方案

    万次阅读 多人点赞 2016-01-26 14:45:59
    动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应用权限. 时代总是不断发展, 程序总是以人为本, 让我们为应用添加动态权限管理吧! 这里提供了一个非常不错的解决方案.Android...
  • Android开发之6.0动态权限工具类(高德地图官方扣出来的),更多请查看我博客:https://blog.csdn.net/xiayiye5/article/details/88657455
  • Android动态权限详解

    千次阅读 2020-04-28 19:50:20
    1什么是动态权限去年底,上级主管部门为加强国内Android应用隐私管理,出台了一系列规定,我们的App也做了相应的修改。主要一条修改为,隐私提示与权限获取顺序。修改测试过程中,发觉部分...
  • Android 7.0动态权限

    千次阅读 2017-11-07 16:24:37
    Android 7.0动态权限,通讯录
  • 动态权限:具体的权限分组情况如下表:group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_...
  • Android6.0动态权限框架

    千次阅读 2018-12-08 12:33:01
    正好最近项目也在做targetSdkVersion升级到28,之前对6.0略微了解点,个人感觉,动态权限的使用这里不太友好,需要在Activity 或者 Fragment 中重写onRequestPermissionsResult 方法,然后处理个个权限的申请结果,...
  • Android动态权限管理

    千次阅读 2017-06-14 19:41:15
    做安卓其实挺费劲的,各种机型都够操心了,动态权限又恶心了一下 but 项目中针对6.0以上手机,还是必要处理一下权限申请的问题!! 首先,判断是否6.0以上,判断是否申请权限,拒绝了的权限怎么办?...
  • Android 6.0 动态权限申请

    千次阅读 2017-09-29 11:40:53
    Android 动态权限 从 Android 6.0 (API 23)开始使用动态的权限及(targetSdkVersion >=23 就需要动态的申请权限),使得系统更加安全,用户的信息也得到了更好的保护。 在android 6.0 中权限被分为两种: 1. ...
  • 对于动态权限,大家应该都不陌生了,在Android6.0版本加入了动态权限的概念,在Android 6.0之前申明权限只需要在AndroidManifest清单中注册相应权限就可以;Android 6.0以上系统就需要根据权限的等级(普通权限和...
  • 动态权限的集成Zxing实现二维码的扫描与生成
  • 【超简单的权限处理】Android 6.0 以上动态权限判断 申明 引用大神的: Android 6.0 动态权限申请简单简洁优雅的处理方式 特点 更加简洁,更加灵活 随时调用,随时处理,单个调用,单个处理。 本来想着直接在...
  • 安卓动态权限的获取

    千次阅读 2019-06-20 12:32:16
    终于找出一个时间,来整理一下,安卓动态权限的获取。仅以此文,记录一下。 首先,拍照权限是比较特殊的,一会儿会一次为例。 首先第一步,在配置文件中,添加所需的文件。 第二步:此处是针对于 拍照权限。 ...
  • Android 短信接收监听的两种方式,由于Android6.0后很多权限需要动态添加,所以本demo首先要解决的问题是如何添加短信的动态权限,而后使用两种方式监听短信接收
  • Android开发中一键获取动态权限

    千次阅读 2019-06-23 01:06:01
    由于安卓开发中动态权限是一个经常用到的,所以为了减轻各位同学开发中遇到动态权限的问题,这边 给大家推荐一个我自己二次封装的第三方方式获取动态权限,也可以参考 https://www.jianshu.com/p/46fddbd0c73f 如果是...
  • Android 6.0动态权限申请

    千次阅读 2017-03-13 12:29:27
    1.Android6.0动态权限的由来 一直以来,Android的权限系统都是最大的安全问题之一,因为在进行安装的时候,所有的权限都会统一进行请求,你必须允许这些权限请求才能进行安装.应用安装后,就可以在用户毫不知情的情况下,...
  • 权限管理在后端项目中主要体现在对接口访问权限的控制,在前端项目中主要体现在对菜单访问权限的控制。在《手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!》中...
  • Android M(6.0)开始,一些危险的权限需要动态申请,称为动态权限或运行时权限,比如摄像头的权限,存储读取权限等。 easypermissions是一个为了简化运行权限申请过程的框架,封装了原生API的一些代码 依赖 注意...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 415,038
精华内容 166,015
关键字:

动态权限