Android之动态申请权限(API23以上需求)
API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
这里以单个存储权限为例:
· 在 Manifest 中添加访问权限:(只需设置可写,因为可写必定可读)
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
· 动态申请权限的过程:
- 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();
- }
- }
- }
- }
- }
Android之动态申请权限(API23以上需求)的更多相关文章
- android:动态申请权限(一)
环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...
- Android 动态申请权限问题【转】
Android 动态申请权限问题 感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4 感谢大佬:https://blog.csdn.net/weixin_42910 ...
- 说说Android6.0动态申请权限的那些坑
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...
- Android permission 动态申请、授权
原文:Android permission 动态申请.授权 Android permission 新特性深度学习 本篇文章介绍android permission系统,并介绍android 6.0 p ...
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...
- flutter 动态申请权限
https://pub.flutter-io.cn/packages/permission_handler https://www.jianshu.com/p/fa68876fbdfd 例 Futur ...
- Android 动态申请权限
AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...
- Android6.0动态申请权限
先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...
- Android开发在Activity外申请权限调用相机打开相册
问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...
随机推荐
- 破解Google Gmail的https新思路
最近,Google针对gmail被攻击事件,全面默认启用了始终以https访问Gmail的方式了.但是,对于可以动用整个国家力量的黑客来说,从网络通讯数据中(在此不讨论对用户电脑种木马破解https的 ...
- 新手mysql 基础语法
SELECT * from new; SELECT stuname FROM new; //查询某一列 SELECT DISTINCT stuname FROM new; //查询同一列中不同的值 S ...
- PHPExcel读取Excel文件的实现代码
<?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...
- SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...
- java运算符
赋值运算符 int num1=10; int num2=30; System.out.println(num1+num2); 算术运算符 int num=20; System.out.println( ...
- JavaScript由浅入深(一)——类型、值和变量
JavaScript是一门面向web的.高端的.动态的.弱类型的编程语言,是学习web前端开发必备的基础技能之一.JavaScript最初是一门脚本语言(scripting-language),它 ...
- 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)
http://www.educity.cn/wenda/351088.html 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap s ...
- C#类的继承,方法的重载和覆写
在网易云课堂上看到唐大仕老师讲解的关于类的继承.方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解. 小总结: 1.类的继承:允许的实例化方式:Student t=new Student() ...
- 关于.NET 的邮件发送类
.NET 类库中已经有现成的封好的类库了,只要引用System.Net.Mail命名空间即可实现发邮件的功能 以下是代码 public class SendMail { private string ...
- iOS学习之MVC模式
Modal 模型对象: 模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算.例如,模型对象可能是表示商品数据 list.用户在视图层中所进行的创建或修改数据的操作,通过控制器对象传达出去 ...