Android权限管理之Permission权限机制及使用
前言:
最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下Android的Permission权限机制及使用
权限管理相关博客:
- Android权限管理之Permission权限机制及使用
- Android权限管理之Android 6.0运行时权限及解决办法
- Android权限管理之RxPermission解决Android 6.0 适配问题
Android权限机制:
权限是一种安全机制。Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。
Android权限列表:
Android权限列表可以参考这篇博客:android权限大全
Android权限使用:
1.)在 AndroidManifest.xml <manifest>标签内使用<uses-permission>声明使用某一个权限
<uses-permission android:name="string"/>
例如申请使用网络权限
<uses-permission android:name="android.permission.INTERNET"/>
如果特定的权限必须申明使用,如果没有申请使用就会报出Permission Denial错误,例如访问通讯录报出如下错误
Caused by: java.lang.SecurityException: Permission Denial: reading com.androintacts.ContactsProvider2 uri content://contacts/data/phones from pid=23763, uid=10036 requires android.permission.READ_CONTACTS
解决此类错误我们只需根据提示添加对应的权限即可
<uses-permission android:name="android.permission.READ_CONTACTS" />
2.)自定义权限permission
虽然这种使用场景不多见,但是在有些特定的场景下出于安全考虑就需要自定义权限了,比如两个APP之间需要共享数据而采用了ContentProvider,此时我们需要对一个app访问另外一个app的数据时需要添加权限申请。自定义权限通过<permission>标签
<permission android:description=”string resource”
android:icon=”drawable resource”
android:label=”string resource”
android:name=”string”
android:permissionGroup=”string”
android:protectionLevel=[“normal” | “dangerous” |
“signature” | “signatureOrSystem”] />
android:description:对权限的描述,比lable更加的详细,介绍该权限的相关使用情况,比如当用户被询问是否给其他应用该权限时。注意描述应该使用的是string资源,而不是直接使用string串。
android:icon:用来标识该权限的一个图标。
android:label:权限的一个给用户展示的简短描述。方便的来说,这个可以直接使用一个string字串来表示,但是如果要发布的话,还是应该使用string资源来表示。
android:name:权限的唯一名字,由于独立性,一般都是使用包名加权限名,该属性是必须的,其他的可选,未写的系统会指定默认值。
android:permissionGroup: 权限所属权限组的名称,并且需要在这个或其他应用中使用<permission-group>标签提前声明该名称,如果没有声明,该权限就不属于该组。
android:protectionLevel:权限的等级
关于android:protectionLevel:权限的等级
normal 低风险权限,只要申请了就可以使用(在AndroidManifest.xml中添加<uses-permission>标签),安装时不需要用户确认;
dangerous 高风险权限,安装时需要用户的确认才可使用;
signature 只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它;
signatureOrSystem 签名相同,或者申请权限的应用为系统应用(在system image中),与signature类似,只是增加了rom中自带的app的声明 ,尽量不要使用该选项,因为signature已经适合绝大部分的情况。
对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限。当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。系统应用可以使用任何权限。权限的声明者可无条件使用该权限。
根据上面的介绍我们实战一下自定义权限如下
<permission
android:name="personprovider.permission.read"
android:description="@string/personprovider_permission_read_desstring"
android:icon="@mipmap/ic_launcher"
android:label="@string/personprovider_permission_read_labestring"
android:protectionLevel="normal"/>
<permission
android:name="personprovider.permission.write"
android:description="@string/personprovider_permission_write_desstring"
android:icon="@mipmap/ic_launcher"
android:label="@string/personprovider_permission_write_labestring"
android:protectionLevel="normal"/>
3.)自定义权限组permission-group
为了方便管理某一特定功能的权限,所以我会对权限进行分组,这时我们需要通过<permission-group>自定义一个权限组
<permission-group android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"/>
android:description 这个属性用于给权限组定义一个用户可读的说明性文本。这个文本应该比标签更长、更详细。这个属性必须要引用一个字符串资源,跟label属性不一样,它不能够使用原生的字符串。
android:icon 这个属性定义了一个代表权限的图标。这个属性要使用包含图片定义的可绘制资源来定义。
android:label 这个属性给权限组定义了一个用户可读的名称。为了开发方便,在开发时,可以直接使用原生的字符串来设置这个属性。但是,当应用程序正式发布时,应该使用字符串资源来设置,以便能够像用户界面中其他的字符串一样能够被本地化。
android:name 这个属性定义了权限组的名称,它是能够分配给<permission>元素的permissionGroup属性的名称。
上面的权限组我们可以自定义为下面这种方式:
<permission-group
android:name="personprovider.permission-group"
android:description="@string/personprovider_permission_group_desstring"
android:icon="@mipmap/ic_launcher"
android:label="@string/personprovider_permission_group_labelstring"/> <permission
android:name="personprovider.permission.read"
android:description="@string/personprovider_permission_read_desstring"
android:icon="@mipmap/ic_launcher"
android:label="@string/personprovider_permission_read_labestring"
android:permissionGroup="personprovider.permission-group"
android:protectionLevel="normal"/>
<permission
android:name="personprovider.permission.write"
android:description="@string/personprovider_permission_write_desstring"
android:icon="@mipmap/ic_launcher"
android:label="@string/personprovider_permission_write_labestring"
android:permissionGroup="personprovider.permission-group"
android:protectionLevel="normal"/>
其他关于permission-tree这里就不介绍了,这个至今没有用到过,<permission-tree>是为一组permissions声明了一个namespace。
4.)使用自定义权限
申请权限
<uses-permission android:name="personprovider.permission.read"/>
<uses-permission android:name="personprovider.permission.write"/>
在宿主上声明需要申请访问权限
<provider
android:name=".PersonProvider"
android:authorities="com.whoislcj.testsqlite.personprovider"
android:enabled="true"
android:exported="true"
android:readPermission="personprovider.permission..read"
android:writePermission="personprovider.permission..write"/>
总结:
本篇大致了解了Android的权限permission以及如何使用和自定义权限,下篇将总结学一下如何解决Android 6.0的权限的适配问题。
Android权限管理之Permission权限机制及使用的更多相关文章
- 【Linux】 Linux权限管理与特殊权限
Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在 ...
- 【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】
一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据 ...
- Linux系列教程(十六)——Linux权限管理之ACL权限
通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...
- Linux权限管理之ACL权限
注:转载自:https://www.cnblogs.com/ysocean/p/7801329.html 目录 1.什么是 ACL 权限? 2.查看分区 ACL 权限是否开启:dump2fs ①.查看 ...
- SNF快速开发平台2019-用户安全控制-权限管理模型实践-权限都在这里
1.1 是否保存密码 勾选记住密码后,再次开启程序用户密码不需要再次输入,直接显示在密码输入框内,方便快捷. 图 4.1‑1 记住密码的登录页面框 1.2 是否自动登录 勾选自动登录后,再 ...
- Android6.0权限管理以及使用权限该注意的地方
Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...
- JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示
上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...
- Linux权限管理:ACL 权限
1.ACL 是什么 ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表.它在UGO权限管理的基础上为文件系统提供一个额外的.更灵活的权限管理机 ...
随机推荐
- Elasticsearch 5.0 中term 查询和match 查询的认识
Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...
- ADO.NET对象的详解
1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
- jquery屏幕滚动计算事件总结
获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度: $(docume ...
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
- 微信小程序教程汇总
目前市面上在内测期间出来的一些实战类教程还是很不错的,主要还是去快速学习小程序开发的整体流程,一个组件一个组件的讲的很可能微信小程序一升级,这个组件就变了,事实本就如此,谁让现在是内测呢.我们不怕,下 ...
- Android之文件数据存储
一.文件保存数据介绍 Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的.文件可用来存放大量数据,如文本.图 ...
- 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' for column 'name' at row 1的异常
这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 我的解决方案是这样的 1.在mysql ...
- 图解Spark API
初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...
- [翻译]Orchard如何工作
Orchard一直是博主心中神一般的存在,由于水平比较菜,Orchard代码又比较复杂看了几次都不了了之了.这次下定决心要搞懂其工作原理,争取可以在自己的项目中有所应用.为了入门先到官网去学习一下相关 ...