动态获取权限

这是一个老生常谈的问题,在Android6.0之前,只要同意安装应用,所有在Manifest文件里声明的权限都能被获取到,而从6.0开始,加入了动态权限,权限被分为normal permission 和 dangerous permission,dangrous permission都是一些可能会侵犯到使用者隐私的权限,所以这些权限都必须在应用需要使用该权限时对用户进行询问是否授予权限。

下面就以一个打电话的权限来演示。在布局文件中写一个button,并给这个button设置点击事件为call()方法。

首先在Manifest文件中加入

然后写了下面两个方法,我们开始分析这两个方法。

private void call() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, PERMISSIONS_REQUEST_CALL_PHONE);

} else {

callPhone();

}

}

callPhone();

}

public void callPhone() {

Intent intent = new Intent(Intent.ACTION_CALL);

Uri data = Uri.parse("tel:" + "10086");

intent.setData(data);

try {

startActivity(intent);

} catch (SecurityException e) {

e.printStackTrace();

}

}

callPhone()方法是我们封装好的一个给10086打电话的方法(雾,没有什么难点,就不解释了。

重点来看call()方法,首先我们要对当前手机的SDK的版本进行判断,如果是Android6.0及以上才去进行权限的判断和获取,否则就直接执行callPhone()方法。当确定SDK版本在6.0及以上时,首先要去确认一下是否已经获取到了权限,如果已经获取到了权限则直接执行callPhone(),没有的话去执行ActivityCompat.requestPermissions(Activity activity,String[] permissions, int requestCode)方法来获取权限。这个方法一共要传入三个参数,第一个是一个activty,第二个是以字符串形式保存的权限名的数组,这里我这只需要申请一个权限,所以就直接在方法里初始化了这个数组,第三个是一个int型的requesetcode,因为我在全局变量里加入了private static final int PERMISSIONS_REQUEST_CALL_PHONE = 1;,所以这里实际上相当于传的是一个1。这个值在我们后边会说到的onRequestPermissionsResult()方法里会用到。

以上我们已经实现了动态权限的获取,但是如果只按以上的代码来写在用户体验上有一些小小的不友好,比如在获取权限时,不论能否获取到权限,用户都不能得到一个有效的反馈,我们希望在申请完权限后,如果用户给了这个权限,就直接运行我们的方法,而当没有获取到时就弹出一个Toast来提示用户没有获取到权限。想要达到这样的效果,我们就需要重写onRequestPermissionsResult方法。

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

if (requestCode == PERMISSIONS_REQUEST_CALL_PHONE) {

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

callPhone();

} else {

Toast.makeText(this, "需要权限", Toast.LENGTH_SHORT).show();

}

return;

}

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

}

在这个方法里,我们用到了上面提到的requestcode,我们需要对每个requestcode进行独立的判断,当获取到的结果为PackageManager.PERMISSION_GRANTED时,说明权限获取成功了,这里的数组grantResults是与上面发送请求时的String数组一一对应的。当权限获取成功时我们直接运行callPhone()方法,没有成功时弹出一个Toast,这样我们就达到了我们想要的效果。

android 动态文件权限设置,Android动态权限相关推荐

  1. Android XML文件中设置字体

    Android提供三种字体:"Sans","serif"和"monospace". 1.在Android XML文件中设置字体 可以采用an ...

  2. android bp文件_Android 基础 | Android.bp 语法浅析

    相关推荐: 随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多.Google 在 7.0 引入了 ninja 是 Google ...

  3. android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...

  4. android设置录音权限设置,android录音权限提示体验,自认比较优雅的解决方法!

    场景:项目仿照github上的一个ChatDemo( https://github.com/Maxi-Mao/ChatDemo ,给出链接感谢作者的开源代码对我项目的帮助!)中的代码实现录音功能,昨晚 ...

  5. android ctrl 左键鼠标左键直接打开xml文件夹,设置Android Studio通过Ctrl+左键查看源码...

    开始学习android的时候希望能点进系统提供的控件中查看源码,但是实际操作发现,看到的每个源文件方法都是抛出的Exception,所以想要设置成可以直接查看具体实现,记录下我自己的操作方法. 1.首 ...

  6. java上传文件怎么设置成777权限_777权限是什么意思?文件夹权限为777如何修改设置?...

    什么是777权限 777权限指的是当前用户可以对相应的文件进行读取.写入和执行的操作,我们建站的时候,有些用户没有对某个文件夹777权限,可能就会造成网站报错,无法正常执行.比如:网站的缓存文件夹,就 ...

  7. 服务器禁止访问文件,服务器文件夹访问权限设置 控制访问权限方法

    在企业局域网中,我们经常需要共享文件供局域网用户访问使用,但是为了保证共享文件的安全,我们也需要设置共享文件的访问权限,防止访问共享文件的用户越权访问共享文件的行为.那么,具体如何实现呢?可以通过以下 ...

  8. 配置共享文件夹--不同文件夹设置不同访问权限

    1 目的 用户可以远程访问服务器上的共享文件夹,每个用户只能访问所在分组的文件夹.管理员拥有全部文件夹的完全控制权限. 2 设置服务器的文件共享属性 点击右下角的"网络和共享中心" ...

  9. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

最新文章

  1. 怎么测试一个人的计算机应用能力,对专业技术人员计算机应用能力考试的思考...
  2. 字符串算法--KMP--Java实现
  3. 数据挖掘十大经典算法之——PageRank 算法
  4. Linux中shell的介绍
  5. spring mvc使用html页面,使用Spring MVC的纯HTML页面应用程序
  6. python 创建空的numpy数组_数据分析-NumPy内置函数创建数组
  7. sklearn模型支持输入list吗?
  8. 循序渐进之Maven(4) - 第一个SpringMVC项目
  9. Windows Live Writer Technical Preview 公布下载
  10. html5 crop,HTML5内联SVG autocrop空格
  11. 西门子CPU扩展以太网接口的一种解决方案
  12. 计算机的屏幕录像,如何进行电脑屏幕录像?电脑录制屏幕视频的方法|电脑屏幕录像的图文步骤...
  13. 截取邮箱后缀名,拼接访问邮箱地址
  14. ARM开发工具历史及分类详解 (最详尽的区分和介绍ARM DS-5,RVD...
  15. C语言之Error C2018: unknown character '0x60'
  16. ready等方法 微信小程序_微信小程序开发一些经验
  17. Java8新特性:等同 final 效果(Effectively Final)
  18. 浏览器视频文件分段缓存合并成完整的视频
  19. halcon算子中文解释
  20. 常见的块元素 行内元素 行内块元素

热门文章

  1. 实战教程|使用知晓云快速制作一个简单的个人博客
  2. 计算机及应用一建,计算机应用与维护专业可以参加一建考试吗?
  3. python临时添加当前工作路径
  4. linux系统函数之mktime
  5. mktime() 函数
  6. 关于单细胞TPM、Count数据的处理
  7. 2021年氟化工艺考试及氟化工艺新版试题
  8. 如何用python做搜索_善用搜索,精准查找Python进阶教程
  9. 2020.8.26丨代谢组测序产品概述
  10. java 数据加载到内存jvm中