一个垃圾的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绑定 ...
随机推荐
- 爬虫之验证码IP攻防心得——小总结
小前言: 一般来说,现在很多平台注册.登录的时候会涉及到验证码,这样做的目的是为了防止恶意程序恶意访问,从而给服务器造成一定的压力,会浪费一定的资源,大家也都知道,现在这种短信平台,邮箱平台等都是收费 ...
- 不断更新的 ToDo-List
有些事情要明着写出来才会去干. 这里是一个不断更新的 ToDo-List,大致按照重要度和列出时间排序,已经完成的会画上删除线. 主要着眼短期计划,其中的大部分事务应该在一周内解决,争取不做一只鸽子. ...
- ubuntu 安装lightgbm
前提:安装好git.cmake 1. 安装lightgbm git clone --recursive https://github.com/Microsoft/LightGBM 2. 编译 下载好的 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- kafka系列九、kafka事务原理、事务API和使用场景
一.事务场景 最简单的需求是producer发的多条消息组成一个事务这些消息需要对consumer同时可见或者同时不可见 . producer可能会给多个topic,多个partition发消息,这些 ...
- saltstack自动化运维系列③之saltstack的常用模块使用
saltstack自动化运维系列③之saltstack的常用模块使用 1.命令的常用方法: 指定主机运行命令 # salt 'mini1' cmd.run 'date'mini1: Fri Apr 7 ...
- 通达OA系统优化-对mysql数据库减肥
OA系统冗余数据过多,访问效率受到影响,现需要对历史数据进行一次清理,以提高OA访问速度 大的数据主要体现在流程上,流程数据主要放在flow_run,flow_run_data,flow_run_pr ...
- Linux中 Lua 访问Sql Server的配置方法
一.背景说明: 通过lua脚本实现对SQL Server数据库的操作. 二.具体设定: 安装流程图:如果是使用Lua连接SQL Server,从上到下则需要安装lua -> luaSQL-ODB ...
- react之异步请求数据,render先行渲染报错,未拿到数据
import React from 'react' import {connect} from 'react-redux' import { Redirect} from 'react-router- ...
- -webkit-line-clamp 限制多行文字
一.应用 CSS代码: .box { width: 100px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: ve ...