Android 6.0后,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。Android官网上也有相关教程:在运行时请求权限。但教程是使用支持库来举例的,用支持库的话,APK的大小也会变得很大,实际上,不使用支持库来请求权限也不难。

下面以请求写储存权限来举例。

一、声明权限

必需要在AndriodManifest.xml文件中声明权限,才能申请使用权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

二、检查权限

如果您的应用需要危险权限,则每次执行需要这一权限的操作时您都必须检查自己是否具有该权限,如果用户之前有授予权限,刚会一直具有该权限,除非用户手动在设置中关闭它。这里可以直接调用context对象中的checkPermission()方法来进行是否有某一项权限的检查,如果具有该权限则返回true,因此我们可以直接调用Activity中的checkPermission()方法。具体代码如下:

private boolean doCheckPermission(String permission) {//检查权限int permissionCheck = checkPermission(permission, Process.myPid(), Process.myUid());if (permissionCheck == PackageManager.PERMISSION_GRANTED) {return true;}return false;}

checkPermission()方法有三个参数,参数的说明如下:

  • String permission:

    要检查的权限名称,如:Manifest.permission.WRITE_EXTERNAL_STORAGE。

  • int pid

    进程ID,可以通过Process.myPid()方法获取。

  • int uid

    用户ID,这个可以通过Process.myUid()方法获取。

三、请求权限

检查完权限后,如果具有该权限,则可以直接运行依赖该权限的代码,如果没有该权限则需要申请该权限。可以调用Activity中的requestPermissions()方法来请求权限,具体代码如下:

private final int MY_WRITE_REQUEST_CODE = 0;private void doRequestPermission(String permission) {if (Build.VERSION.SDK_INT >= 23) {//requestPermissions()方法需要SDK23requestPermissions(new String[]{permission}, MY_WRITE_REQUEST_CODE);}
}

requestPermissions()方法有两个参数:

  • String[] permissions

    要申请的多个权限。

  • int requestCode

    请求代码,用于处理请求时,唯一识别这个请求,在下面的处理请求模块要用到。

使用requestPermissions()请求权限时,需要注意的是:这个方法的调用是异步的,它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法。也就是说,调用这个方法后,会继续执行接下来的语句,所以不能在这个方法后马上执行依赖该权限的代码。而是要等到用户授权后,系统自动调用相应的回调方法,在回调方法(下面介绍)中处理依赖该权限的代码。

四、处理权限请求响应

我们需要重写Activity中的onRequestPermissionsResult()方法来处理请求的结果。当用户允许或者拒绝该权限时,系统会调用Activity中的onRequestPermissionsResult()方法。具体的代码处理如下:

    @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case MY_WRITE_REQUEST_CODE:// If request is cancelled, the result arrays are empty.if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "onRequestPermissionsResult: request write permission success!");//处理依赖权限的代码} else {Log.d(TAG, "onRequestPermissionsResult: request write permission fail!");//请求失败,没有权限,不能运行依赖权限的代码}break;}}

这个方法中的requestCode就是上面请求权限时的请求代码,在上面的例子中,该请求代码为MY_WRITE_REQUEST_CODE。可以看到,这里用switch语句来接收请求代码来区分不同的权限请求,然后进行相应的处理。

到这里,完整的检查权限、请求权限和处理请求的流程都介绍完了,下面是完整的Demo。

例子程序

AndriodManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.permissionnosupport"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><application android:allowBackup="true" android:icon="@mipmap/ic_launcher"android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

MainActivity.java

package com.example.permissionnosupport;import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.util.Log;public class MainActivity extends Activity {private final String TAG = "test";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (doCheckPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {Log.d(TAG, "onCreate: 应用具有写外部存储的权限");//进行依赖权限的代码} else {Log.d(TAG, "onCreate: 应用不具有写外部存储的权限");doRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);}}private boolean doCheckPermission(String permission) {int permissionCheck = checkPermission(permission, Process.myPid(), Process.myUid());if (permissionCheck == PackageManager.PERMISSION_GRANTED) {return true;}return false;}private final int MY_WRITE_REQUEST_CODE = 0;private void doRequestPermission(String permission) {if (Build.VERSION.SDK_INT >= 23) {//requestPermissions()方法需要SDK23requestPermissions(new String[]{permission}, MY_WRITE_REQUEST_CODE);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case MY_WRITE_REQUEST_CODE:// If request is cancelled, the result arrays are empty.if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "onRequestPermissionsResult: request write permission success!");//处理依赖权限的代码} else {Log.d(TAG, "onRequestPermissionsResult: request write permission fail!");//请求失败,没有权限,不能运行依赖权限的代码}break;}}
}

Android不使用支持库请求运行时权限相关推荐

  1. android权限询问,Android:检查是否必须询问运行时权限

    我想检查一个特定的应用程序是否需要在运行时处理Android Marshmallow运行时权限. 以下假设是否正确? /** * Checks whether runtime permissions ...

  2. 获取权限android sync,GitHub - AndSync/XPermissionUtils: 可能是最精简的Android6.0运行时权限处理方式,支持Rationale提示...

    # XPermissionUtils 可能是最精简的Android6.0运行时权限处理方式,支持Rationale提示,只有一个类,100行代码,所有弹窗等操作由用户自行处理,在Demo中也有提供代码 ...

  3. Android 6.0 运行时权限处理完全解析

    一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...

  4. Android 8.0 运行时权限策略变化和适配方案

    Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过AndroidStudio3.0 Canary版本下载Android O最新的系统映像的Developer Pr ...

  5. 聊一聊Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...

  6. Android M 新的运行时权限开发者需要知道的一切

    android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿 ...

  7. android新运行时权限

                                                    新运行时权限 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次.一旦安 ...

  8. 如何优雅地申请Android运行时权限

    转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识.在默认情况下任何应用都没有权限执行对其他应用.操作系统或用 ...

  9. Android运行时权限终极方案,用PermissionX吧

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新. 各位小伙伴们大家早上好,不知道你的<第三行代码>已经读到哪里了? 有些朋友的阅读 ...

最新文章

  1. 测试人员如何赢得开发人员的尊重
  2. 牛客网 Wannafly挑战赛8 A.小Y和小B睡觉觉
  3. Android自定义View之仿QQ侧滑菜单实现
  4. NYOJ -804 Gift (二分)
  5. [XPath] XPath 与 lxml (三)XPath 坐标轴
  6. hive与spark的匹配版本汇总
  7. Linux 免密码sudo
  8. php soap传值,在SOAP调用中传递PHP数组
  9. 计算机等级考试机试试题,计算机等级考试二级VFP机试试题18
  10. Multisim、protel和proteus的区别
  11. 顶尖的语音识别软件――Nuance Recognizer_语音识别_CTI论坛
  12. java字符串直接比较_java中对于字符串的比较直接用“==”合适吗?
  13. 运输层_TCP可靠传输的实现
  14. ISO7637-2瞬态浪涌波形详解
  15. 难得清醒好文:年轻人你活着不是为了看K线——李小鹏
  16. dos命令以及制作.bat文件
  17. 基于华为路由器实现NAT
  18. matlab生成主对角占优,matlab实现判断是否能否生成严格对角占优矩阵
  19. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)
  20. python.exe无法找到入口 无法定位程序输入点

热门文章

  1. python3 获取 文件 文件夹大小
  2. python3 hasattr getattr setattr delattr 对象属性 反射
  3. linux编译c++11的代码
  4. sqlite3.OperationalError: database is locked
  5. Arduino各开发板针脚示意图
  6. PHP Notice: undefined index 解决方法
  7. Android--EditText控件属性汇总
  8. OpenWRT中运行脚本报错
  9. 机器学习的若干问题解释
  10. mysql需要vc_VC连接MySql