一个垃圾的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绑定 ...
随机推荐
- retrofit 基础使用
1.先导入依赖 加上网络权限 <uses-permission android:name="android.permission.INTERNET" /> 2.创建接口 ...
- Linux时间日期类指令
⒈date [Options] 显示/设置当前日期 基本语法: date 显示当前时间 date +"%Y" 显示当前年份 date +"%m" 显示当前月份 ...
- js使用中的小问题----textarea是否有value属性
使用jquery的选择器时想给textarea设置一个默认值时,采取了下面的方法: 不过失败了,但是看教程上确实成功的,那么肯定是有问题的. 经过上网查找以及自己验证发现: 1.textarea标签确 ...
- 《TCP/IP 详解 卷1:协议》第 3 章:链路层
在体系结构中,我们知道:链路层(或数据链路层)包含为共享相同介质的邻居建立连接的协议和方法,同时,设计链路层的目的是为 IP 模块发送和接受 IP 数据报,链路层可用于携带支持 IP 的辅助性协议,例 ...
- Linux下常见音频格式之间的转换方法
Linux下常见音频格式之间的转换方法[转] 下面简单介绍下Linux环境常见音频格式之间的转换方法: MP3 相关工具: lameOGG 相关工具: vorbis-toolsAPE 相关工具: ma ...
- Java 开发环境配置--eclipse工具进行java开发
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java Cloud Studio ...
- 《Oracle 11g 入门到精通.明日科技.pdf》学习笔记
本博文整理者:刘军 本博文出自于: <Oracle 11g 入门到精通>一书 声明:1:转载请标注出处.本文不得作为商业活动.本人不负法律责任.违法者自负一切法律责任. ————————— ...
- WAP网页中点击链接直接拨打电话的方法
主要方法有两种: 第一种: 这种也是最简单的. 示例代码: <a href="tel:+18790853577">点击拨打</a> 第二种: <a h ...
- linux ubuntu 指令
查找文件:ls -lrt /java 用于查找java文件信息 https://ipcmen.com/ls编辑/etc/profilewen文件,在文件末尾添加export JAVA_HOME=/us ...
- jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决
textarea和select的值clone的时候会丢掉,在clone的时候将val再重新赋值一下,如果知道这个了就简单了, 测试发现,textarea和select的jquery的clone方法有问 ...