Android 权限申请

Android 权限申请

参考资料

https://www.jianshu.com/p/338741725cd0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
Android权限(普通权限+危险权限)
https://blog.csdn.net/feibendexiaoma/article/details/80093354
允许安装未知来源权限(一)
https://blog.csdn.net/qq_34330286/article/details/79660059
Android6.0以上允许读写权限

  • Android权限分类*

正常权限,危险权限,特殊权限

  1. 正常权限

正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。此类权限都是正常保护的权限,只需要在Manifest文件中简单声明,安装即授权,如网络权限
配置方法,在Manifest文件中简单声明,安装即授权

 <uses-permission android:name="android.permission.INTERNET" />
  1. 危险权限

危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。

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

配置方法,使用时先检查权限是否开启,未开启则需要用户手动开启
如果App需要用到危险权限,需要这一权限的操作时都必须检查自己是否拥有该权限。检查权限代码如下所示:

   // Assume thisActivity is the current activity  
   int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);

如果应用已经具有了该权限,此方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED,此时应用应当进行权限申请。
Android危险权限
编号 权限组 权限

  0 CALENDAR READ_CALENDAR WRITE_CALENDAR
  1 CAMERA CAMERA
  2 CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
  3 LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
  4 MICROPHONE RECORD_AUDIO
  5 PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
  6 SENSORS BODY_SENSORS
  7 SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
  8 STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

注意:表格中的每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中的其他权限也会同时被授权。
配置源码
单个权限

//第一步:看权限是否已经被申请,没有则申请权限
 private void CheckPermssion(){
     boolean haveInstallPermission;
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
     {
         //是否有获取手机EMEI权限
  if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
             {
 //第二步调用requestPermissions申请权限
  ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_PHONE_STATE},2);
             }
     }
 }
 //第三步:若有需要,调用回调函数
   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 }

多个权限

    //第一步:看权限是否已经被申请,没有则申请权限
        private void CheckPermssion(){
                 List<String> permissionList = new ArrayList<>();
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED) 
        {
                            permissionList.add(Manifest.permission.CALL_PHONE);
                        }
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
        {
                            permissionList.add(Manifest.permission.READ_PHONE_STATE);
                        }
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
         {        permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                        }
                        if (!permissionList.isEmpty()) 
        {
                            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                     //第二步调用requestPermissions申请权限
                            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
                        } 
                    }
                }
        }
        //第三步:若有需要,调用回调函数
          @Override
            public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
                switch (requestCode) {
                    case 1:
                        if (grantResults.length > 0) {
                            for (int result : grantResults) {
                                if (result != PackageManager.PERMISSION_GRANTED) {
                                    Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
                                    finish();
                                    return;
                                }
                            }
                            call();
                        }else{
                            Toast.makeText(MainActivity.this, "发生未知错误", Toast.LENGTH_SHORT).show();
                            finish();
                        }
                        break;
                }
            }
        }

3 特殊权限

有许多权限其行为方式与正常权限及危险权限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细信息,以响应该 intent。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aly_D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值