有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另外一个应用程序,最常见的时直接打开了另外一个应用程序,并进入其中某个Activity(如:有的应用中有推荐应用列表,当用户点击时程序会首先判断其他应用有无安装,若无则提示用户下载,如有则直接打开进入)。有时候,处于安全等需要,此类操作需要加上受限制性的访问限制,那么怎么办呢?Android中为我们提供了自定义权限。

为了讲清自定义权限,先以不同的程序之间访问Activity增加权限限制为例。假设应用程序A中有MainActivity,应用程序B中有AActivity和BActivity。现在想通过A中的MainActivity直接打开B中的BActivity。

那么,如果不考虑权限,A中的MainActivity如何直接打开B中的BActivity呢?一般,可以通过如下方式:

public class MainActivity extends Activity {

    private Button button;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClassName("com.example.testandroid", "com.example.testandroid.BActivity");
startActivity(intent);
}
});
}
}

这段代码很好理解,主要是通过Intent中的setClass(String packageName, String className)方法,需要注意的是此时需要写上包的全名。同时,针对B中的BActivity需要在AndroidManifest.xml文件中进行如下配置:

 <activity
android:name="com.example.testandroid.BActivity"
android:exported="true" >
</activity>

至此,我们还没有用到自定义权限。假设现在需要对外部应用程序直接打开BActivity做些访问性限制,为其增加一个自定义权限,这样,只有在声明了此自定义权限的外部应用,才具有资格打开BActivity。具体步骤如下:

1.既然是自定权限,那么首先得申明此权限:

在B中的AndroidManifest.xml中,一般是紧跟uses-sdk标签后,通过permission标签进行申明。

1 <permission android:description="string resource"
2 android:icon="drawable resource"
3 android:label="string resource"
4 android:name="string"
5 android:permissionGroup="string"
6 android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />

各属性具体含义如下:

属性 含义 是否必须
name  自定义的权限名称,需要遵循Android权限定义命名方案:*.permission.*  是
protectionLevel

义与权限相关的"风险级别"。必须是以下值之一:
normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作。
normal 表示权限是低风险的,不会对系统、用户或其他应用程序造成危害;
dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限;
signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它;
signatureOrSystem 表示将权限授给具有相同数字签名的应用程序或android 包类。这一保护级别适和于非常特殊的情况,比如多个供应商需要通过系统映像共享功能时

是
permissionGroup

可以将权限放在一个组中,但对于自定期义权限,应该避免设置此属性。如果确实希望设置此属性,可能使用以下属性代替:android.permisson-group.SYSTEM_TOOLS

否
label 可使用它对权限进行简短描述 否
description 使用它提供对权限用途和所保护对象的更有用的描述 否
icon 权限可以与资源目录以外的图标相关联 ( 比如@drawable/myicon) 否

2.当B中BActivity进行权限限定时,需要对BActivity进行如下声明:

1 <activity
2 android:name="com.example.testandroid.BActivity"
3 android:exported="true"
4 android:label="B"
5 android:permission="corn.permission.CORN_OWN" >
6 </activity>

3.此时外部应用A中的Activity想直接打开B中BActivity,则需要添加上相应权限:

1 <uses-permission android:name="corn.permission.CORN_OWN" >
2 </uses-permission>

这就是Activity自定义权限的一般性流程。总体说来,当不同应用间Activity Receiver定义了权限并进行了外部访问权限限定时,外部应用则必须具备此权限才能直接访问此Activity Receiver。

同样的,在Android的其他系统组件中,如BroadcastReceiver、ContentProvider及Service中,具有同样的权限限定,用户可以按照实际需要自定义权限,只是细节上些许不同而已。在此不做过多介绍。

[android开发篇]自定义权限的更多相关文章

  1. android开发之自定义组件

    android开发之自定义组件 一:自定义组件: 我认为,自定义组件就是android给我们提供的的一个空白的可以编辑的图片,它帮助我们实现的我们想要的界面,也就是通过自定义组件我们可以把我们要登入的 ...

  2. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  3. 开年钜献:华清远见金牌讲师名家大讲堂(Android开发篇)

        华清远见作为嵌入式培训领导品牌,嵌入式就业课程已成为业内公认的专业人才培养体系!华清远见致力于让更多嵌入式技术爱好者及在校大学生获得一线嵌入式系统开发关键技术应用的经验,于2009年始开办名家 ...

  4. [android开发篇]权限分类:正常权限和危险权限

    https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous 系统权限 本文内容 安全架构 ...

  5. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

  6. Android开发之自定义的ListView(UITableViewController)

    Android开发中的ListView, 顾名方法思义,就是表视图.表示图在iOS开发中就是TableView.两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量 ...

  7. Android开发进阶——自定义View的使用及其原理探索

    在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...

  8. android - 解决“应用自定义权限重名”

    背景 现场的开发今天跟我说,测试包装不上!报错"应用自定义权限重名"!!! 网上百度下关键字,发现魅族手机有这个毛病,顺藤摸瓜:"http://bbs.flyme.cn/ ...

  9. Android开发之自定义局部导航菜单

    如今,要实现导航功能方案有很多.比如: 1.用3.0+自带的Toolbar + Fragment导航. 2.用Tabhost实现导航.小弟学浅,就只用过这两种方案实现导航. 但是这两种方案都有一个很明 ...

随机推荐

  1. leetcode140 Word Break II

    思路: 直接爆搜会超时,需要使用记忆化搜索.使用map把已经计算过的情况记录下来,避免重复计算. 实现: class Solution { public: vector<string> w ...

  2. POSTGRESQL 存储过程实战

    转了N多的SQL语句,可是自己用时,却到处是坑啊,啊,啊!!!!!!!!!!!!!!! 想写一个获取表中最新ID值. 上代码 CREATE TABLE department( ID INT PRIMA ...

  3. 【js】数组去重时间复杂度为n的方法

    # 时间复杂度O(n^2) function fn(arr) { return arr.filter((item, index, arr) => arr.indexOf(item) === in ...

  4. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  5. iOS组件化开发· 什么是组件化

    越来越多公司,开始了组件化,你还要等到什么时候...... 说到开发模式,我们最熟知的开发模式 MVC 或者最近比较热门的MVVM.但是我今天说的组件化的开发,其实MVC不是一类的.它其实是····· ...

  6. linux各文件夹的作用(转)

    转自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可 ...

  7. window服务的使用

    目前的项目中使用很多服务来进行实现.服务是依靠windows操作系统来实现.可以是定时器类型,比如定时执行费时的任务,这种任务时最多.也可以是一些服务(SOAP)的宿主,不在限制与iis,不现在限制于 ...

  8. Ubuntu下软件的搜索与安装

    本文为笔者原创,首发于简书(点击这里查看). 小白玩转linux的第一个拦路虎就是软件的安装了.本文结合自己在Ubuntu14.04下软件安装经验做一个总结. 1.如何搜索软件? apt-cache ...

  9. 如何计算CDS view里两个时间戳之间的天数间隔

    ABAP透明表里的时间戳,数据类型为dec: 有个需求:计算这两个时间戳之间的天数间隔,丢弃时间戳年-月-日8位后面的小时:分钟:秒. 举个例子:如果时间戳是20180918173132,丢弃1731 ...

  10. ace editor 使用教程

    <!DOCTYPE html><html> <head> <title>Demo of ACE Editor</title> <!-- ...