目录(?)[-]

  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. csv .xlsx

    def gen_file_data(fodir, fname, sheet_index=0, ): if fname.find('.xlsx') > -1: fname_open = '%s\\ ...

  2. 监听并保存ssh账号密码

    有时候渗透搞下一台服务器的权限,想通过此服务器抓取其他服务器的ssh密码.就可以用以下方法,如果管理员通过这台服务器作为跳板登录其他服务器,密码就会记录下来. alias ssh='strace -o ...

  3. python cookbook第三版学习笔记十九:未包装的函数添加参数

    比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...

  4. BAPI LIST

    [转自 http://blog.csdn.net/minsenwu/article/details/8432081] 库存管理BAPI 库存: 1. BAPI_MATERIAL_AVAILABILIT ...

  5. 10 个经典PHP函数

    这篇文章主要介绍了php中的10个比较经典的函数,不太常见,可以满足有特殊需求的朋友 1. sys_getloadavg() sys_getloadavt()可以获得系 统负载情况.该函数返回一个包含 ...

  6. rails数据验证

    @user1 = :name => "zhou" 与 @user2 = :name=> "ZHOU" 在为保存之前都有可能通过第一关validate ...

  7. UI控制滑杆插件

    在线演示 本地下载

  8. jQuery图片水平滑动延迟加载动画

    在线演示 本地下载

  9. <软件架构与设计模式>侯捷老师关于Adapter类在STL中的深入解析和模式探讨

    题外话:侯捷老师难得一年就来上九堂课就要会宝岛,特此留念签名赠语及合照以自勉.  学海无涯,为勤是岸 <正文开始> 昨天晚上连上了3个小时的大课探究单单讲了Adapter一个类,幸运的是本 ...

  10. POJ 1183 反正切函数的应用

    H - 反正切函数的应用 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit ...