目录(?)[-]

  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. activiti基础--1------------------------生成.bpmn和.png以及部署流程定义

    helloworld.dbmn <?xml version="1.0" encoding="UTF-8"?> <definitions xml ...

  2. 尽量不要在viewWillDisappear:方法中移除通知

    1.iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法.   2.在做手势和通知等一系 ...

  3. linux FAQ(zz)

    1.Which is the command used to find the available shells in your Operating System Linux ? Ans : $ech ...

  4. android 电池(三):android电池系统【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8709838 一.电池系统结构 Android中的电池使用方式主要有三种:AC.USB. ...

  5. Docker dockerfile命令详解

    docker-file 官网文档:https://docs.docker.com/v17.09/engine/reference/builder/ 制作Dockerfile为Docker入门学习的第一 ...

  6. ThinkPHP的Auth类认证

    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 .  RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了 ...

  7. 51nod 1525 && CF566D

    题意:给定n个元素,现在有2种合并操作和1种询问操作 1.单独合并两个元素所在的集合 2.合并一个区间内的元素所在的集合 询问:两个元素是否属于统一集合 神犇题解 感觉又涨了新姿势啊..我们最恼火的是 ...

  8. JAVA中的4种线程池的使用

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  9. oarcle12c打开本地数据库

    --显示当前数据库的链接db,是cdb还是pdb. show con_name;--在oracle12c中打开本地数据库,否则本地数据库无法链接alter pluggable database pdb ...

  10. Linux下查看Python安装了哪些脚本模块

    Linux下查看Python安装了哪些脚本模块 1.什么是rpm ? rpm 即RedHat Package Management,是RedHat的发明之一 .现在包括OpenLinux.fedora ...