API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。

这里以单个存储权限为例:

· 在 Manifest 中添加访问权限:(只需设置可写,因为可写必定可读)

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

· 动态申请权限的过程:

  1. package com.dragon.android.permissionrequest;
  2.  
  3. import android.Manifest;
  4. import android.content.DialogInterface;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.net.Uri;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.provider.Settings;
  11. import android.support.annotation.NonNull;
  12. import android.support.v4.app.ActivityCompat;
  13. import android.support.v4.content.ContextCompat;
  14. import android.support.v7.app.AlertDialog;
  15. import android.support.v7.app.AppCompatActivity;
  16. import android.widget.Toast;
  17.  
  18. public class MainActivity extends AppCompatActivity {
  19.  
  20. // 要申请的权限
  21. private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
  22. private AlertDialog dialog;
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28.  
  29. // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
  30. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  31.  
  32. // 检查该权限是否已经获取
  33. int i = ContextCompat.checkSelfPermission(this, permissions[0]);
  34. // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
  35. if (i != PackageManager.PERMISSION_GRANTED) {
  36. // 如果没有授予该权限,就去提示用户请求
  37. showDialogTipUserRequestPermission();
  38. }
  39. }
  40. }
  41.  
  42. // 提示用户该请求权限的弹出框
  43. private void showDialogTipUserRequestPermission() {
  44.  
  45. new AlertDialog.Builder(this)
  46. .setTitle("存储权限不可用")
  47. .setMessage("由于支付宝需要获取存储空间,为你存储个人信息;\n否则,您将无法正常使用支付宝")
  48. .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
  49. @Override
  50. public void onClick(DialogInterface dialog, int which) {
  51. startRequestPermission();
  52. }
  53. })
  54. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  55. @Override
  56. public void onClick(DialogInterface dialog, int which) {
  57. finish();
  58. }
  59. }).setCancelable(false).show();
  60. }
  61.  
  62. // 开始提交请求权限
  63. private void startRequestPermission() {
  64. ActivityCompat.requestPermissions(this, permissions, 321);
  65. }
  66.  
  67. // 用户权限 申请 的回调方法
  68. @Override
  69. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  70. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  71.  
  72. if (requestCode == 321) {
  73. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  74. if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  75. // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
  76. boolean b = shouldShowRequestPermissionRationale(permissions[0]);
  77. if (!b) {
  78. // 用户还是想用我的 APP 的
  79. // 提示用户去应用设置界面手动开启权限
  80. showDialogTipUserGoToAppSettting();
  81. } else
  82. finish();
  83. } else {
  84. Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
  85. }
  86. }
  87. }
  88. }
  89.  
  90. // 提示用户去应用设置界面手动开启权限
  91.  
  92. private void showDialogTipUserGoToAppSettting() {
  93.  
  94. dialog = new AlertDialog.Builder(this)
  95. .setTitle("存储权限不可用")
  96. .setMessage("请在-应用设置-权限-中,允许支付宝使用存储权限来保存用户数据")
  97. .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
  98. @Override
  99. public void onClick(DialogInterface dialog, int which) {
  100. // 跳转到应用设置界面
  101. goToAppSetting();
  102. }
  103. })
  104. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  105. @Override
  106. public void onClick(DialogInterface dialog, int which) {
  107. finish();
  108. }
  109. }).setCancelable(false).show();
  110. }
  111.  
  112. // 跳转到当前应用的设置界面
  113. private void goToAppSetting() {
  114. Intent intent = new Intent();
  115.  
  116. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  117. Uri uri = Uri.fromParts("package", getPackageName(), null);
  118. intent.setData(uri);
  119.  
  120. startActivityForResult(intent, 123);
  121. }
  122.  
  123. //
  124. @Override
  125. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  126. super.onActivityResult(requestCode, resultCode, data);
  127. if (requestCode == 123) {
  128.  
  129. if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  130. // 检查该权限是否已经获取
  131. int i = ContextCompat.checkSelfPermission(this, permissions[0]);
  132. // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
  133. if (i != PackageManager.PERMISSION_GRANTED) {
  134. // 提示用户应该去应用设置界面手动开启权限
  135. showDialogTipUserGoToAppSettting();
  136. } else {
  137. if (dialog != null && dialog.isShowing()) {
  138. dialog.dismiss();
  139. }
  140. Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
  141. }
  142. }
  143. }
  144. }
  145. }

Android之动态申请权限(API23以上需求)的更多相关文章

  1. android:动态申请权限(一)

    环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...

  2. Android 动态申请权限问题【转】

    Android 动态申请权限问题 感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4 感谢大佬:https://blog.csdn.net/weixin_42910 ...

  3. 说说Android6.0动态申请权限的那些坑

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...

  4. Android permission 动态申请、授权

    原文:Android permission 动态申请.授权 Android permission 新特性深度学习 本篇文章介绍android permission系统,并介绍android 6.0 p ...

  5. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  6. flutter 动态申请权限

    https://pub.flutter-io.cn/packages/permission_handler https://www.jianshu.com/p/fa68876fbdfd 例 Futur ...

  7. Android 动态申请权限

    AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...

  8. Android6.0动态申请权限

    先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...

  9. Android开发在Activity外申请权限调用相机打开相册

    问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...

随机推荐

  1. 破解Google Gmail的https新思路

    最近,Google针对gmail被攻击事件,全面默认启用了始终以https访问Gmail的方式了.但是,对于可以动用整个国家力量的黑客来说,从网络通讯数据中(在此不讨论对用户电脑种木马破解https的 ...

  2. 新手mysql 基础语法

    SELECT * from new; SELECT stuname FROM new; //查询某一列 SELECT DISTINCT stuname FROM new; //查询同一列中不同的值 S ...

  3. PHPExcel读取Excel文件的实现代码

    <?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...

  4. SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录

    1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...

  5. java运算符

    赋值运算符 int num1=10; int num2=30; System.out.println(num1+num2); 算术运算符 int num=20; System.out.println( ...

  6. JavaScript由浅入深(一)——类型、值和变量

      JavaScript是一门面向web的.高端的.动态的.弱类型的编程语言,是学习web前端开发必备的基础技能之一.JavaScript最初是一门脚本语言(scripting-language),它 ...

  7. 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)

    http://www.educity.cn/wenda/351088.html 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap s ...

  8. C#类的继承,方法的重载和覆写

    在网易云课堂上看到唐大仕老师讲解的关于类的继承.方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解. 小总结: 1.类的继承:允许的实例化方式:Student t=new Student() ...

  9. 关于.NET 的邮件发送类

    .NET 类库中已经有现成的封好的类库了,只要引用System.Net.Mail命名空间即可实现发邮件的功能 以下是代码 public class SendMail { private string ...

  10. iOS学习之MVC模式

    Modal 模型对象: 模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算.例如,模型对象可能是表示商品数据 list.用户在视图层中所进行的创建或修改数据的操作,通过控制器对象传达出去 ...