Android 动态权限申请
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | package com.dragon.android.permissionrequest; 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.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; public class MainActivity extends AppCompatActivity { // 要申请的权限 private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; private AlertDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission( this , permissions[ 0 ]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED) { // 如果没有授予该权限,就去提示用户请求 showDialogTipUserRequestPermission(); } } } // 提示用户该请求权限的弹出框 private void showDialogTipUserRequestPermission() { new AlertDialog.Builder( this ) .setTitle( "存储权限不可用" ) .setMessage( "由于支付宝需要获取存储空间,为你存储个人信息;\n否则,您将无法正常使用支付宝" ) .setPositiveButton( "立即开启" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startRequestPermission(); } }) .setNegativeButton( "取消" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).setCancelable( false ).show(); } // 开始提交请求权限 private void startRequestPermission() { ActivityCompat.requestPermissions( this , permissions, 321 ); } // 用户权限 申请 的回调方法 @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 ]); if (!b) { // 用户还是想用我的 APP 的 // 提示用户去应用设置界面手动开启权限 showDialogTipUserGoToAppSettting(); } else finish(); } else { Toast.makeText( this , "权限获取成功" , Toast.LENGTH_SHORT).show(); } } } } // 提示用户去应用设置界面手动开启权限 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(); } // 跳转到当前应用的设置界面 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 ); } // @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(); } } } } } |
1 | <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步