【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
运行安全通过两个层面进行保护。进程层面:不同应用运行在不同的进程,每个应用有独自的user ID;在操作层面,Android定义了所需保护的功能和资源,如果应用需要访问这些信息,必须在AndroidManifest.xml文件中请求许可,应用可以有自定义的许可。
进程边界
每个应用的userID不同,使得各个进程之间存在隔离的边界,防止应用直接获取其他应用的数据,需要通过content provider,用intent唤起其他应用的acitivity,通过service和其他应用通信,这些需要专门代码仔细实现。
声明和使用权限
Android对需要保护的资源和能力要求在AndroidManifest.xml中进行生命,在安装时由用户进行许可,如果没有许可,任何尝试执行或访问相关功能的会permission failure。Android系统相关的许可,可以阅读:http://developer.android.com/reference/android/Manifest.permission.html。
AndroidManifest.xml的许可设置
下面是设置访问摄像头,读取联系人和日历。
<manifest … >
<application>
…
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CALENDAR" />
</manifest>
也可以通过图形界面进行设置。
自定义权限
可对任何的component进行自定义许可,例如activity。在下面的例子中,应用A为ProPermission,当中有个activity为PrivActivity,在应用A中,我们将对这个组件进行权限的自定义声明。应用B为ProPermissionClient,在应用B中,通过intent唤起应用A的PrivActivity,应用B需要请求在应用A中的自定义权限。
我们先来看看应用A。
应用A的PrivActivity很简单,layout里面就一个textview。重点看看在AndroidManifest.xml中如何为PrivActivity提供自定义的权限。首先,我们要定义一个自定义的权限,其次,我们将这个自定义的权限加诸在PrivActivity上。
定义自定义的权限,可以使用图形界面,如下所示:
我们自定义的权限名字为wei.permission.STARTPRIVACTIVITY,格式参考系统权限android.permission.xxxxx。Label和Description都不是必须的,主要用来描述权限的内容,起到注释的作用,对于不喜欢写文档的我们,就要在编程中尽量做到不言自明,因此好的编程风格,应该加上相关的说明。Permission group对于自定义的权限是不应该填写的,如果非要设置(何必呢),可以填android.permission-group.SYSTEM_TOOLS。
Protection level值得注意,权限保护等级划分为normal、dangerous、signature、signatureOrSystem。normal表示权限是低风险的,不会对系统、用户或其他应用程序造成危害。dangerous表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限。signature表明只有当应用程序所用数字签名与声明此权限的应用程序所有数字签名相同时,才能将权限授给它。signatureOrSystem表示将权限授给具有相同数字签名的应用程序或Android包类,这一级别适用于非常特殊的情况,比如多个供应商需要通过系统img共享功能时。
AndroidManifest.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest ……>
<uses-sdk …… />
<!-- 自定义的代码由上述的图形界面帮助生产 -->
<permission android:name="wei.permission.STARTPRIVACTIVITY"
android:label="start priv activity"
android:protectionLevel="normal"
android:description="@string/startPrivActivityDesc" />
<application ....... >
<activity android:name="cn.wei.flowingflying.propermission.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="PrivActivity"
android:permission="wei.permission.STARTPRIVACTIVITY"
android:label="@string/privActivity">
<intent-filter >
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
</application>
</manifest>
在PrivAcitivity的定制中,通过android:permission属性来声明该组件的需要具备的权限。我们还注意到,通过<intent-filter>来对activity做进一步说明。如果没有<intent-fliter>,应用B调用是则会报错,如下:
这个报错和权限没有关系,而是应用B视图调用其他应用的activity,而两者具有不同的userID,无法进行调用。如果要调用,则PrivActivity需要声明自己运行被调用,本例通过表明是MAIN,可以被外部调用。也可以用下面表明支持隐性调用方式,说明可被调用。
<intent-filter >
<action android:name="cn.wei.flowingflying.propermission.intent.action.PrivActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
现在,让我们来看看应用B,应用B通过intent的方式调用应用A的PrivActivity,程序代码很简单,不在重复,可以下载例子来查看。应用B在AndroidManifest.xml中请求自定义权限的方式和请求系统权限方式一样,如下:
<uses-permission android:name="wei.permission.STARTPRIVACTIVITY" />
如果没有进行权限请求,则会报错:
本博文涉及的例子代码,可以在Pro Android学习:permission例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限的更多相关文章
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
- 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference
目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...
- 【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference
目录(?)[-] CheckBox Preference xml文件 设备的存贮文件 复合preference 在ListPreference的例子中显示的是单选,如果是多选,可采用CheckBoxP ...
- 【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条
目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable ...
- 【转】Pro Android学习笔记(五):了解Content Provider(上)
Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider ...
- 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图
目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
随机推荐
- 洛谷 4035 [JSOI2008]球形空间产生器
题目戳这里 一句话题意 给你 n+1 个 n 维点,需要你求出这个n维球的球心.(n<=10) Solution 这个题目N维的话确实不好想,反正三维就已经把我搞懵了,所以只好拿二维类比. 首先 ...
- css position: relative,absolute具体解释
关于CSS中 position在布局中非常重要,查了非常多资料都说的非常难理解.以下说说个人的理解: 语法: position: relative | absolute relative: 对象遵循常 ...
- 变量动态选取资源ID
1.使用Resources 类的 getIdentifier方法 Resources res=getResources(); return res.getIdentifier(type ...
- HTML5离线存储和本地缓存
一.离线存储 有一个web应用有三个文件index.html,a.js,b.css,现在需要把js和css文件缓存起来 1.在index.html里加上<html manifest=" ...
- python基础6 ----python函数
python函数 一.函数的参数 1.函数的参数从调用的角度来讲可以分为形式参数和实际参数,也可叫形参和实参. 形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元. ...
- GIT笔记:GITHUB教程【官方自译版】
GIT笔记:将项目发布到GITHUB GITHUB是什么 GitHub是版本控制和协作的代码托管平台.它可以让你和其他人在任何地方一起工作. 1.创建一个新的仓库 存储库通常用于组织单个项目.存储库可 ...
- pandas to_datetime()
>>> import pandas as pd >>> i = pd.date_range() >>> df = pd.DataFrame(dic ...
- Data Structure Linked List: Merge Sort for Linked Lists
http://www.geeksforgeeks.org/merge-sort-for-linked-list/ #include <iostream> #include <vect ...
- IE浏览器和CSS盒模型【转】
总结:css盒模型在不同浏览器之间(例如:ie和其他浏览器 如火狐)的差异只存在于ie6之前的版本中,如ie5.在ie6下, Internet Explorer 在标准模式下渲染时使用了 CSS 规范 ...
- The Great Pan
The Great Pan Time Limit:1000MS Memory Limit:65536KB ...