一个垃圾的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绑定 ...
随机推荐
- JDK7与8内存参数解析与修改
JDK内存 jdk内存实际是jvm内存,jvm有一个运行时数据区,其实就是对这一部分的大小分配. 运行时数据区通常包括这几个部分:程序计数器(Program Counter Register).Jav ...
- CentOS和RedHat Linux的区别
RHEL 在发行的时候,有两种方式.一种是二进制的发行方式,另外一种是源代码的发行方式. 无论是哪一种发行方式,你都可以免费获得(例如从网上下载),并再次发布.但如果你使用了他们的在线升级(包括补丁) ...
- Jetson tk1 安装OpenNI 1 +Xtion Pro +NiTE
参考: http://blog.csdn.net/xiabodan/article/details/44496871 序: 由于第三方库 NiTE2.0 不支持 arm 架构的处理器,因此需要安装Op ...
- EB-GAN系(Energy-based GAN)
学习总结于国立台湾大学 :李宏毅老师 EB-GAN: Energy-based Generative Adversarial Network MA-GAN:MAGAN: Margin Adaptati ...
- linux系统的休眠与唤醒简介
转自:http://blog.csdn.net/haomcu/article/details/7398703 系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很 ...
- Linux系统打开core dump的配置【转】
什么是core dump core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.core du ...
- jdk8系列二、jdk8方法引用、重复注解、更好的类型推断、新增注解
一.方法引用 方法引用使得开发者可以直接引用现存的方法.Java类的构造方法或者实例对象.方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码. 方法 ...
- Python3学习笔记25-logging模块
logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...
- 读SRE Google运维解密有感(二)
前言 这是读“SRE Google运维解密”有感第二篇,第一篇参见 这本书最近又读了几章,结合自己的经历,有些地方真的能感同身受,有些地方也惊叹SRE充满辩证的思想,总之SRE是好一本好书,会给你很大 ...
- 重装windows系统后配置Anaconda
给电脑换了系统,十分担心anaconda需要重装.还好以下方法完美解决.(同是win10 64位) 原始anaconda安装路径:D:\ProgramData\Anaconda3 (不能有空格哦) ...