Android权限询问的实例详解
作者:陈浩南的楠 发布时间:2022-10-03 21:28:51
标签:Android,权限,询问
AndroidMaifest.xml中声明权限
<!-- 声明所有需要的权限(包括普通权限和危险权限) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
直接上代码,放在想要拦截的地方即可 ,一般是程序启动时即访问
private static final int MY_PERMISSION_REQUEST_CODE = 10000;
//第 1 步: 检查是否有相应的权限,
boolean isAllGranted = checkPermissionAllGranted(
new String[] {
//根据自己需求,进行添加相应的权限
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}
);
// 如果权限全都拥有, 则直接初始化日志文件
if (isAllGranted) {
configureLog4J.configure();//有权限之后要做的事情
return;
}
//第 2 步: 请求权限
// 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
ActivityCompat.requestPermissions(
this,
new String[] {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
MY_PERMISSION_REQUEST_CODE
);
//检查是否拥有指定的所有权限
private boolean checkPermissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则直接返回 false
return false;
}
}
return true;
}
//第 3 步: 申请权限结果返回处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSION_REQUEST_CODE) {
boolean isAllGranted = true;
// 判断是否所有的权限都已经授予了
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
// 如果所有的权限都授予了, 则初始化日志文件
configureLog4J.configure();//有权限之后要做的事情
} else {
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
openAppDetails();
}
}
}
//打开 APP 的详情设置
private void openAppDetails() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("该程序需要访问 “外部存储器”,请到 “应用信息 -> 权限” 中授予!");
builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
来源:https://www.cnblogs.com/fjn-blogs/archive/2022/09/29/16741432.html


猜你喜欢
- 一、deleteById 和 delete为什么要把这两个方法放在一起呢?我们先看源码再说deleteById(Id id)(通过id进行删
- 本系列文章会根据项目的进度进行相关介绍,其会分为多个模块,每个模块互不依赖,各个模块都是单独的学习内容,如sqlite学习模块,contac
- 一、ServletConfig讲解1.1、配置Servlet初始化参数在Servlet的配置文件web.xml中,可以使用一个或多个<
- AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个
- 1.什么是继承?(1)用来提高代码的复用性(2)将相同的功能模块封装到方法中需要使用时调用方法达到代码复用的目的(3)通过继承将多个类中的相
- 目录闲言碎语:背景Actuator介绍Rest方法来查看Actuatorpom.xml引入Actuator依赖配置application.y
- 1、前期准备需要在Manifest中添加相关权限<uses-permission android:name="android
- 目录二维码生成原理(即工作原理)效果图如下:前提:源码如下:总结二维码生成原理(即工作原理)二维码官方叫版本Version。Version
- 一、线程的生命周期线程状态转换图:1、新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状
- 一、前言上一篇文章中我们已经Spring Boot 利用注解方式整合 MyBatis,今天我们就来看看,如何利
- Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。Java
- 去掉DataTable中(所有列的数据都相同)重复的行: //DataView dv = dt3.DefaultView;&nbs
- 问题在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入@Autowiredprivate Pro
- 使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办?换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻?自己写的代
- 6.0的手机对于写入手机需要申请权限的我做了如下处理下面我贴出代码package com.example.admin.sdapplicati
- Autowired有两种注入方式by typeby name默认使用的是byType的方式向Bean里面注入相应的Bean。例如:@Auto
- 方法一、使用系统控件ViewFlipper方式:布局文件:<ViewFlipper andro
- 具体实现过程请看下面代码:简单的调用了一下系统的拍照功能代码如下所示://拍照的方法 private void openTakePhoto(
- final 类final 类不能被继承,同时,一旦用 final 修饰了类,也就意味着 final 类中的所有方法都被隐式地指定为 fina
- 下载地址在这里:http://dotnetzip.codeplex.com/下载到的包里有很多个dll文件,一般引用Ionic.Zip.dl