第一步在app的build.gradle文件中添加:

dependencies {
// PermissionDispatcher 框架的使用
implementation 'com.github.hotchemi:permissionsdispatcher:2.1.3'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
implementation 'com.android.support:support-v4:28.0.0'
}

在activity中

package com.xiaozhuyisheng.jinjiedemos.activity;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.Toast; import com.xiaozhuyisheng.jinjiedemos.BaseActivity;
import com.xiaozhuyisheng.jinjiedemos.R; import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions; // 必须的注解,它用来注册一个Activity或Fragment使他们可以处理权限
@RuntimePermissions
public class PermissionDemoActivity extends BaseActivity { /**
* @RuntimePermissions:必须的注解,它用来注册一个Activity或Fragment使它们可以处理权限
* @NeedsPermission:必须的注解,在需要获取权限的地方注解,用来获取权限
* @OnShowRationale:提示用户为何要开启权限,在用户选择拒绝后,再次需要访问该权限时调用
*@OnPermissionDenied:用户选择拒绝时的提示
* @OnNeverAskAgain:用户选择不再询问后的提示
*/ @Override
protected int initLayoutID() {
return R.layout.activity_permission;
} @Override
protected void initLogic() {
// 拨打电话
findViewById(R.id.btnCall).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PermissionDemoActivityPermissionsDispatcher.callWithCheck(PermissionDemoActivity.this);
}
});
} @NeedsPermission(Manifest.permission.CALL_PHONE)
// 在需要获取权限的地方注释
void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "1337196838");
intent.setData(data);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
startActivity(intent);
} // 提示用户为何要开启权限
@OnShowRationale(Manifest.permission.CALL_PHONE)
void showWhy(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage("拨打电话时需要该权限")
.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// 再次执行权限请求
request.proceed();
}
})
.show();
} // 用户选择拒绝时的提示
@OnPermissionDenied(Manifest.permission.CALL_PHONE)
void showDenied() {
Toast.makeText(this,"用户选择拒绝时的提示",Toast.LENGTH_LONG).show();
} // 用户选择不再询问后的提示
@OnNeverAskAgain(Manifest.permission.CALL_PHONE)
void showNotAsk() {
new AlertDialog.Builder(this)
.setMessage("该功能需要拨打电话")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) { }
})
.show();
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionDemoActivityPermissionsDispatcher.onRequestPermissionsResult(this,requestCode,grantResults);
}
}

其中:

PermissionDemoActivityPermissionsDispatcher 类重新编译后自动生成

最新文章

  1. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
  2. 移动互联网公司如何将BPM流程管理变身移动化?
  3. 樱花漫地集于我心,蝶舞纷飞祈愿相随 発生:genesis 发生:genesis
  4. 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)
  5. 【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)
  6. 轻量级应用开发之(07) UIPickerView使用
  7. Google十大惊人产品
  8. HTML属性
  9. UltraISO制作linux启动盘(包含写入不完整解决方法)
  10. Java:Object类的equals()方法 如何编写一个完美的equals()方法
  11. mysql全日志添加时间戳以及SQL多行问题处理(更新)
  12. 使用jquery 的ajax 与 Java servlet的交互
  13. Postgresql插入或更新操作upsert
  14. day03变量的命名规范,常量,输出:自带换行,输入,注释,数据类型,运算符,常用字符大小关系
  15. rman list命令
  16. CSS 小结笔记之图标字体(IconFont)
  17. 使用devenv/MSBuild在命令行编译sln或csproj
  18. Flash:移除匿名函数监听器EventListener
  19. spring+mybatis的插件【shardbatis2.0】+mysql+java自定义注解实现分表
  20. DRM学习总结(1)--- DRM框架介绍

热门文章

  1. SpringBoot系列: url重定向和转发
  2. 动态规划dp
  3. C++ 实现简单命令行学生管理系统
  4. vue使用md5,base64方法
  5. 【hdu 5632】Rikka with Array
  6. PWD的编译及调试
  7. 关于Setup Factory 9的一些使用方法
  8. 更改 Ubuntu默认Python版本的问题
  9. pythonのdjango连接MYSQL
  10. 一个基于Net 的CMS -- Umbraco CMS