Android之动态申请权限(API23以上需求)

少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述Android之动态申请权限(API23以上需求)相关的知识,希望能为你提供帮助。
API 23之前的版本都是自动获取权限,而从 android 6.0 开始添加了权限申请的需求,更加安全。
 
这里以单个存储权限为例:
  · 在 Manifest 中添加访问权限:(只需设置可写,因为可写必定可读)
【Android之动态申请权限(API23以上需求)】 

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

 

    推荐阅读