目录(?)[-]

  1. 进程边界
  2. 声明和使用权限
    1. AndroidManifestxml的许可设置
  3. 自定义权限

运行安全通过两个层面进行保护。进程层面:不同应用运行在不同的进程,每个应用有独自的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):权限和自定义权限的更多相关文章

  1. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  2. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  3. 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference

    目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...

  4. 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference

    目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...

  5. 【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference

    目录(?)[-] CheckBox Preference xml文件 设备的存贮文件 复合preference 在ListPreference的例子中显示的是单选,如果是多选,可采用CheckBoxP ...

  6. 【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条

    目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable ...

  7. 【转】Pro Android学习笔记(五):了解Content Provider(上)

    Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider ...

  8. 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图

    目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...

  9. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  10. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

随机推荐

  1. 【基于rssi室内定位报告】rssi分布情况标识位置

    import matplotlib matplotlib.use('Agg') import numpy as np from numpy import array from matplotlib i ...

  2. MyEclipse2014新增bug,尝鲜的朋友需注意NotFoundException: org.springframework.web.context.ContextLoaderListener

    事实上标题后面加上这个异常信息并不合适,可是为了方便和我遇到相同问题的童鞋搜到这篇文章.我不得不这样写啦. 这个异常和你的程序没有关系,假设你没有忘记增加spring Jar包的话,这是fucking ...

  3. Android JSON And Object Cast

    Ref:JSON字符串转换成Java实体类(POJO) Ref:Java.Json转换方式之二:Jackson Ref:Jackson 框架,轻易转换JSON Ref:几种序列化协议(protobuf ...

  4. windows10 Python2和Python3共存

    通过配置环境变量,达到使用python命令启动python2,使用python3命令启动python3,pip启动pip2, pip3启动pip3的目的,互不影响. 1.安装python2.7  安装 ...

  5. python编写脚本应用实例

    这里主要记录工作中应用python编写脚本的实例.由于shell脚本操作数据库(增.删.改.查)并不是十分直观方便,故这里采用python监控mysql状态,然后将状态保存到数据库中,供前台页面进行调 ...

  6. Mac安装使用kettle

    kettle是一个ETL工具 下载安装 https://jaist.dl.sourceforge.net/project/pentaho/Data Integration/ 选择版本后下载,并解压,如 ...

  7. 统计apachelog各访问状态个数(使用MapReduce)

    统计日志文件中各访问状态的个数. 1.将日志数据上传到hdfs 路径 /mapreduce/data/apachelog/in 中 内容如下 ::::::: - - [/Feb/::: +] :::: ...

  8. AJAX+json+jquery实现预加载瀑布流布局

    宽度是一定的高度不定的瀑布流布局 也可以说是无缝拼图 当浏览器滚动到底部时候自动加载图片 加载的图片地址用json 在img.js里 ,还有正在加载动画是用 css3制作的 在ff等支持css3可以显 ...

  9. form 中Enctype=multipart/form-data 的作用

    form 中Enctype=multipart/form-data 的作用 ENCTYPE="multipart/form-data"用于表单里有图片上传. <form na ...

  10. asp.net中关于《%=》《%#》《%》 的用法——(转帖)

    1:在.aspx页面,<% %>标签相当于在.cs页面的代码,也就是说你在.cs文件里面怎样写,就可以在.aspx文件里面的<% %>标签里面怎样写. 2:在.aspx页面,& ...