有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另外一个应用程序,最常见的时直接打开了另外一个应用程序,并进入其中某个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. Gin框架body参数获取

    需求: 记录所有请求的json数据 body, _ := ioutil.ReadAll(c.Request.Body) if body != nil { log.Info("请求body内容 ...

  2. volatile双重锁实现单例

    双重锁实现单例时遭到质疑,既是:双重锁也无法保证单例模式! 原因是:指令会重排序,普通的变量仅仅会保证该方法在执行时,所有依赖的赋值结果是正确的,但不会保证执行顺序! 为什么会重排序:指令重排序是指c ...

  3. Objective-C Loops

    There may be a situation, when you need to execute a block of code several number of times. In gener ...

  4. spark常用参数

    val conf = new SparkConf().setAppName("WordCount_groupBy").setMaster("local") // ...

  5. Mysql常用的优化技巧

    1.通过show status 命令了解各种sql的执行效率 2. 定位执行效率较低的SQL语句 开启慢查询记录: 打开Mysql配置文件my.ini ,找到 [mysqld] 在其下面添加 long ...

  6. windows Git的安装和使用

    一.本人是根据廖雪峰大神的个人官网学习的git,并有感而发以做笔记的方式写下这篇博客,希望可以帮助到自己和其他人,廖雪峰个人官网http://www.liaoxuefeng.com/ 二.声明我的电脑 ...

  7. 删除.cpp文件

    今天启动vc6.0后随手直接建了一个.cpp文件(没有建什么工程的),编译运行成功后,就把vc关了.后想把这个随手建的文件给删掉,却怎么也找不到这个文件,文件搜索或改变文件的属性也无法找到这个文件,即 ...

  8. 精仿百思不得姐客户端应用iOS源码

    XFBaiSiBuDeJie 高仿百思不得姐客户端 初次学习使用RAC,还不是怎么熟悉,使用的仍是MVC模式,MVVM还在摸索中... 如果大家觉得还不错,请给颗星星支持下~~~ 程序中使用到的库 A ...

  9. 【GIMP学习】抠图方法二则

    之前抠图都比较二,懒人我尝试过在线抠图软件.以及在线PS简易版,真的都很不好用,前者简单粗暴,后者我遇到各种储存不能的bug. 在ubuntu的环境下有一个功能可以和PS相媲美的功能强大图片处理软件G ...

  10. 数据倾斜是多么痛?spark作业调优秘籍

    目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么?      CSDN日报20170703——<从高考到程序员——我一直在寻找答案>      [直播]探究L ...