Android M

在上一篇中简单介绍了运行时权限,今天就讲讲怎么去申请权限。这个项目中本来用了一个第三方的权限框架,但是不太好用,我就在github上选择了start最多的PermissionsDispatcher。这个框架非常好用,下面来了解下它的用法。

配置

首先呢就是在项目的build.gradle文件里添加

dependencies {

compile("com.github.hotchemi:permissionsdispatcher:${latest.version}") {

// if you don't use android.app.Fragment you can exclude support for them

exclude module: "support-v13"

}

annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:${latest.version}"

}

repositories {

jcenter()

maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }

}

其中${latest.version}要换成版本号,当前最新的版本号为3.0.1 。Rebuild一下工程就好了。

介绍

注解

是否必须

描述

@RuntimePermissions

注册一个 Activity 或 Fragment 用于处理权限

@NeedsPermission

注解一个方法,说明需要什么权限(一个或多个)

@OnShowRationale

注解一个方法,解释为什么需要这些权限

@OnPermissionDenied

注解一个方法,当用户拒绝授权时将调用该方法

@OnNeverAskAgain

注解一个方法,当用户选择了 "不再提醒" 将调用该方法

示例

@RuntimePermissions

public class UserInfoTokenActivity extends BaseActivity{

...

@NeedsPermission(Manifest.permission.CAMERA)

void openCamera() {

UtilTools.getImageFromCamera(this);

}

@OnShowRationale(Manifest.permission.CAMERA)

void showRationale(final PermissionRequest request) {

request.proceed();

}

@OnPermissionDenied(Manifest.permission.CAMERA)

void showDeniedForStorage() {

AppUtils.showRequestPermissionDialog(this, String.format(

getString(R.string.camera_permission_message), getString(R.string.app_name)));

}

@OnNeverAskAgain(Manifest.permission.CAMERA)

void showNeverAskForStorage() {

AppUtils.showRequestPermissionDialog(this, String.format(

getString(R.string.camera_permission_message), getString(R.string.app_name)));

}

@Override

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

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

UserInfoTokenActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);

}

...

}

注意:

类前加RuntimePermissions注解;

加注解的方法千万不要写成private

OnShowRationale注解的方法有参数,开始我没注意,怎么也不能生成UserInfoTokenActivityPermissionsDispatcher这个类;

不要直接调用注解的方法,要通过如下方式调用:

UserInfoTokenActivityPermissionsDispatcher.

openCameraWithPermissionCheck(UserInfoTokenActivity.this);

效果

调用需要权限的方法(用NeedsPermission注解的)时,如果已经授予该权限,直接执行这个方法,如果没有该权限,会弹出授权提示框:

权限请求

点击按钮会执行OnShowRationale注解的方法,我这个里边就让方法继续执行了,即显示拍照。如果点击“拒绝”就会执行OnPermissionDenied注解的方法,我这个方法里是仿照微信写的,弹出提示框,如下:

拒绝提示框

其中,AppUtils代码如下:

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.provider.Settings;

import android.support.v4.content.ContextCompat;

/**

* 作者:WangJintao

* 时间:2017/10/13

* 邮箱:wangjintao1988@163.com

*/

public class AppUtils {

public static void showRequestPermissionDialog(final Context context, String message) {

AlertDialog dialog = new AlertDialog.Builder(context).setPositiveButton(context.getString(R.string.go_setting), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//打开应用列表

AppUtils.openAppSettingList(context);

dialog.dismiss();

}

})

.setNegativeButton(context.getString(R.string.cancel), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

})

.setCancelable(false)

.setMessage(message)

.setTitle(R.string.permission_title)

.show();

//设置按钮颜色

dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.black));

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.main_color));

}

public static void openAppSettingList(Context context) {

Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent);

}

}

点击“不再询问”执行OnNeverAskAgain注解的方法,参考微信执行的也是弹出提示框。

关于应用安装时权限申请的说明

在我这个APP里,定位和电话权限是必须的,所以安装后就必须申请,PermissionsDispatcher可以同时申请多个权限,但是我没这样用,我还是用的一个个申请,先去申请电话权限,如果用户点击“拒绝”弹出提示框,用户再点击提示框中的取消,就关闭这个APP,点击去设置再跳转到设置界面,如果开始用户就点击了“允许”,然后再去申请定位权限,运行效果与微信一致。

android申请多个运行时权限,Android 6.0(API 23) 运行时权限(二)之权限申请相关推荐

  1. android 6.0 sd卡读写权限,Android 6.0 读写SD卡权限问题

    一.问题描述## Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中 [预置条件]插入T卡[操作步骤]设置>存储设备和USB>选择SD卡为默认存储& ...

  2. 安装Android SDK需要选择哪些,开始为Android开发,我应该选择安装哪些SDK?

    我开始将我的开发人员技能扩展到Android开发. 我安装了所有的工具和配置,每件事看起来都很棒,作为默认设置,我安装了3.2 SDK,但是没有太多的文档在那个,2.x SDK上的模式是什么. 它是否 ...

  3. C++ 实验二 NO.2 身高预测 设faHeight为其父身高,moHeight为其母身高,身高预测公式为:男性成人时身高=(faHeight + moHeight)×0.54cm;女性成人时身高

    //******************************************************************************************** //*程序 ...

  4. Android权限系统(三):运行时权限检查和申请,PermissionController

    请求应用权限的最佳实践   Google提供的请求应用权限的说明如下:请求应用权限   官方提供的模板使用了三个条件分支来请求应用权限:   1.checkSelfPermission用来检查应用是否 ...

  5. android方法数据库的权限,Android数据存储,运行时权限

    Android存储目录 Android的底层支持是Linux,不同于Windows,没有分盘的概念,是以文件夹形式呈现,可以理解为一个应用就是一个用户. data目录 手机内部存储目录(手机本身内存) ...

  6. android获取imei需要read_phone_state吗,Firemonkey android read_phone_state运行时权限要求获取IMEI...

    编辑:对不起,我没有在FireMonkey上做更多的功课.这就是我坚持自己的主题,而不是属于它的主题.我已经添加了这些内容,试图让我的答案更值得赏金. 如果您可以将应用清单上的targetSdk限制为 ...

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

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

  8. API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。

    这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写必定可读) <uses-permission android:name="android.p ...

  9. android动态申请悬浮框权限,Android创建悬浮窗的完整步骤

    在Android中想要创建悬浮窗分为三步 1.申请权限 2.使用服务启动悬浮窗 3.设置悬浮窗参数并添加进WindowManager 下面话不多说了,来一起看看详细的实现过程 申请权限 首先需要申请悬 ...

最新文章

  1. 马斯克要办大学上了热搜
  2. 代码注释规范-google版本
  3. 2018年最值得关注的15大技术趋势,区块链将得到更广泛的应用
  4. 互联网企业的电子商务社区会员模式浅谈
  5. python实现windows Service服务程序
  6. kubernetes kubelet参数
  7. illustrator插件开发指南pdf_Jenkins之pipeline开发工具
  8. 【模版】求单个/多个欧拉函数值
  9. Java 定时任务-最简单的3种实现方法
  10. js移除某个样式_JS removeAttribute()方法:删除元素的某个属性
  11. 量化交易让股市成为你的印钞机
  12. unity 接入谷歌广告
  13. 安卓 sdk 离线包_百度离线ocr识别开发sdk包
  14. java并发编程 目录_Java并发编程实战的作品目录
  15. C语言猜数游戏两位数
  16. 刷题集--郁闷的出纳员
  17. golang汉字转拼音字头和五笔码
  18. CSS3实现立体旋转动画效果
  19. 如何匹配私域合会员制形式
  20. 浙大计算机实验室详细推介

热门文章

  1. 【kafka】Kafka Consumer 中的心跳线程有什么作用?
  2. 【ElasticSearch】Es 源码之 IndicesClusterStateService 源码解读
  3. 【ElasticSearch】Es 源码之 Netty4HttpServerTransport 源码解读
  4. 【Kafka】Kafka ERROR [ConsumerFetcherThread-console-consumer], Error for partition [xx,5] to broker 10
  5. Memcache监控小工具stats命令
  6. 95-140-106-源码-transform-算子filter
  7. 95-190-540-源码-window-清除器(Evictors)-TimeEvitor简介
  8. datx 开启debug
  9. Cookie、Session、Token、JWT分别是什么(一)
  10. 云计算实战系列四(Linux文件权限I)