一个垃圾的Android权限框架
一个垃圾的Android权限框架
学习和参考
写在前头
今天突发奇想想要把Android申请权限的流程封装一下,为使得Android的权限申请更加容易一些。所以经过一番资料的查询和研究,做了一个小小的垃圾权限框架,不优雅也不高效。
项目信息
Github地址
https://github.com/littledavid-tech/GarbagePermission

如何使用此框架
添加依赖
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.littledavid-tech:GarbagePermission:V1.0.1'
}
调用代码
//Way 1
GarbagePermission
.with(this)
.permissions(arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CALL_PHONE))
.callback(object : OnPermissionRequestListener {
//当权限被同意的时候,此方法被调用
override fun onGranted(permission: String) {
Log.e("TAG", "Granted")
}
//当权限被完全拒绝的时候(勾选了不再提醒复选框),此方法被调用
override fun onDenied(permission: String) {
Log.e("TAG", "Denied")
}
//当权限被拒绝的时候但并非完全拒绝的时候,此方法被调用
override fun onRationale(permission: String) {
Log.e("TAG", "Rationale")
}
})
.request()
//Way 2
GarbagePermission
.with(this)
.permissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE))
.callback(object : SimpleOnPermissionRequestListener() {
override fun onGranted(permission: String) {
Log.e("TAG", "Granted")
}
})
.request()
实现思路
只有在Android6.0以及之后的版本中,才需要进行动态权限的申请,在6.0之前是不用动态申请权限的。在申请权限的时候,我们习惯于在App首次运行的时候于启动界面将所有的界面都进行申请,并且在进行高危操作的使用,在进行检测权限,如果没有授权则进行权限的申请。
当我们申请权限后,我们必须调用Activity或者Fragment的 onRequestPermissionsResult 方法,所以我们的框架肯定是离不开Activity或者Fragment,又因为Activity比Fragment要独立,所以这里选择了Activity。
我们将所有请求权限的所有的业务逻辑都封装在一个Activity里面,当需要申请权限的时候就启动这个Activity进行权限的申请。
/**
* 权限相关的回调接口
* The callback interface for request permission
* @see SimpleOnPermissionRequestListener
*/
interface OnPermissionRequestListener {
/**
* 当权限被同意的时候,此方法会被调用
* */
fun onGranted(permission: String)
/**
* 如果权限被完全拒绝(勾选了不再提示复选框) 此方法会被调用
* */
fun onDenied(permission: String)
/**
* 如果此方法没有被完全地拒绝(没有勾选不再提示复选框)此方法会被调用
*
* */
fun onRationale(permission: String)
}
class PermissionActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_permission)
//避免用户手动启动此Activity
if (!intent.hasExtra(ACCESS_TOKEN)) {
finish()
}
val permissions = intent.getStringArrayExtra("permissions")
//判断SDK版本
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(permissions, REQUEST_CODE)
}
}
@TargetApi(23)
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode != REQUEST_CODE) {
return
}
//根据选项的不同,调用不同的回调
for ((index, value) in permissions.withIndex()) {
if (grantResults[index] == PackageManager.PERMISSION_GRANTED) {//接受
mPermissionCallback?.onGranted(value)
} else if (shouldShowRequestPermissionRationale(value)) {//拒绝,但没有完全拒绝
mPermissionCallback?.onRationale(value)
} else {//拒绝
mPermissionCallback?.onDenied(value)
}
}
finish()
}
override fun onDestroy() {
mPermissionCallback = null
super.onDestroy()
}
companion object {
private var mPermissionCallback: OnPermissionRequestListener? = null
/**
* 通过这个标志位来避免用户手动地打开此Activity,而非调用show方法
* */
private const val ACCESS_TOKEN = "token_permission"
private const val REQUEST_CODE = 10086
/**
* 显示此Activity
* @param context 上下文
* @param permissions 需要进行请求的权限数组
* @param callback 处理权限问题的回调
*
* @see OnPermissionRequestListener
* */
fun show(context: Context, permissions: Array<String>, callback: OnPermissionRequestListener?) {
mPermissionCallback = callback
val intent = Intent(context, PermissionActivity::class.java)
intent.putExtra(ACCESS_TOKEN, ACCESS_TOKEN)
intent.putExtra("permissions", permissions)
context.startActivity(intent)
}
}
}
但是这还不能够满足我们的要求,因为现在Activity还能够被用户感知到(废话,打开一个Activity,用户看不到就怪了),所以我们还需要对Activity进行一些特殊的设置。将Activity的背景等设置为不可见的状态。
<!--定义一个透明的Activity的Style/Theme-->
<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@color/colorTransparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowNoTitle">true</item>
</style>
为Activity设置上Style,在 Manifest 中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.shycoder.gargabepermissionlibrary">
<application>
<activity
android:name=".PermissionActivity"
android:theme="@style/Transparent" />
</application>
</manifest>
搞一个门面类
距离成功还差一点点,虽然我们通过上面建立的Activity就已经能够进行申请权限了,但是直接开启Activity请求权限太不雅观了啊
一个垃圾的Android权限框架的更多相关文章
- Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客 ...
- 简单实用的Android ORM框架TigerDB
TigerDB是一个简单的Android ORM框架,它能让你一句话实现数据库的增删改查,同时支持实体对象的持久化和自动映射,同时你也不必关心表结构的变化,因为它会自动检测新增字段来更新你的表结构. ...
- .net通用权限框架B/S(一)
一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...
- Android 数据库框架总结,总有一个适合你!
一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/39057201),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...
- Android Xutils 框架(转)
Android Xutils 框架 (转) 目录(?)[-] xUtils简介 目前xUtils主要有四大模块 使用xUtils快速开发框架需要有以下权限 混淆时注意事项 DbUtils使用方法 Vi ...
- Android Afinal框架
项目如图: 本文参考网络! Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少.在android应用开发中,通过 Afinal的ioc框架,诸如ui绑定 ...
随机推荐
- mysql一次查询,返回多个统计结果
1.sum(if) select sum(if(status=1,1,0)) as s1_count,sum(if(status=2,1,0)) as s2_countfrom order; 2.co ...
- vlc-android 的编译过程
参考官方文档:https://wiki.videolan.org/AndroidCompile#Get_VLC_Source 值得注意的的地方: 1.切记安装以下工具 sudo apt-get ins ...
- Linux压缩和解压缩类指令
⒈gzip ①gzip 文件 压缩文件,只能将文件压缩为*.gz文件 ②gunzip 文件.gz 用于解压文件 ⒉zip ①zip [选项] xxx.zip 需要压缩的内容 压缩文件和目录 常用选项: ...
- Centos7.5 防火墙设置
Centos7.5默认使用firewalld作为防火墙 1.查看firewalld服务状态 systemctl status firewalld 2.查看firewalld的状态 firewall-c ...
- matplotlib 画图
matplotlib 画图 1. 画曲线图 Tompson = np.array([0, 0, 0, 0, 0.011, 0.051, 0.15, 0.251, 0.35, 0.44, 0 ...
- Kaggle 泰坦尼克
入门kaggle,开始机器学习应用之旅. 参看一些入门的博客,感觉pandas,sklearn需要熟练掌握,同时也学到了一些很有用的tricks,包括数据分析和机器学习的知识点.下面记录一些有趣的数据 ...
- nodejs 文件拷贝
小文件拷贝 我们使用NodeJS内置的fs模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSyn ...
- vi与vim
vi 的使用 基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在 ...
- 单个 LINQ to Entities 查询中的两个结构上不兼容的初始化过程中出现类型“XXXX”
最近在做一个报表的时候,用EF使用了Contact方法,但是程式运行一直出错.最近终于找到原因了,写下来提醒下自己.好了,进入正题: 现在我举个栗子,目前数据库中有ParentStudent表和Sub ...
- hostapd 和 wap_supplicant
hostapd : user space daemon for access points, including, e.g., IEEE 802.1X/WPA/EAP Authenticator fo ...