权限是一种安全机制。Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。在Android开发中,基本上都会遇到联网的需求,我们知道都需要加上联网所需要的权限:

 <uses-permission android:name="android.permission.INTERNET" />

实际上,在开发过程中,当我们使用了某些系统特性的功能,且此类特性需要包含相应权限时,如果在AndroidManifest.xml文件中相应申明,则会运行错误且提示:java.lang.SecurityException: Permission Denial ...

根据此错误提示,一般情况下,在AndroidManifest.xml中通过 uses-permission 增加上相应权限即可。

一、Android权限列表:

那么,Android中有哪些受限制性访问的特性呢?具体的特性对应所需要的权限名称又是什么呢?具体可以在Android官方文档中查的。

http://developer.android.com/reference/android/Manifest.permission.html

需要注意的是,不同的权限可能对应了不同的API等级,因此,可能会出现兼容性问题。

二、Android自定义权限:

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

一定要为Activity中的属性android:exported设置值为true,以表示可以被其他应用程序打开。或者,也可以进行如下配置:

 <activity
android:name="com.example.testandroid.BActivity" >
<intent-filter>
<action android:name="" />
</intent-filter>
</activity>

为Activity设置一个空的action  android:name属性。

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

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

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

 <permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
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进行如下声明:

 <activity
android:name="com.example.testandroid.BActivity"
android:exported="true"
android:label="B"
android:permission="corn.permission.CORN_OWN" >
</activity>

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

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

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

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

Android总结篇系列:Android 权限的更多相关文章

  1. Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)

    注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程.例如:当Activity A到Activity B时,如果内存不足,A被回收, ...

  2. Android总结篇系列:Activity中几个主要函数详解

    Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又 ...

  3. 【转】Android总结篇系列:Activity Intent Flags及Task相关属性

    [转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...

  4. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  5. 【转】Android总结篇系列:Activity生命周期

    [转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...

  6. Android总结篇系列:Android Service

    Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: ...

  7. Android总结篇系列:Android广播机制

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  8. Android总结篇系列:Activity启动模式(lauchMode)

    本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址: http://blog.csdn.net/l ...

  9. [android开发篇]使用系统权限流程

    1 声明权限https://developer.android.com/training/permissions/declaring.html 每款 Android 应用都在访问受限的沙盒中运行.如果 ...

随机推荐

  1. 即将放出ITSEC第一期所有培训视频

    课程大概被分为三个章节 客户端安全培训 安全工具培训 服务端安全培训   部分PPT                         详细课程表 FireBug代码调试工具使用:工具介绍 FireBu ...

  2. JQuery 表格拖动调整列宽效果

    类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整.最近比较空闲,便自己动 ...

  3. Cubieboard2裸机开发之(一)点亮板载LED

    前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...

  4. String to Date 多种格式转换

    在做Excel数据导入的时候,有些日期文本转换为日期格式时,需要适应多种格式,转换代码如下: static Date multiParse(String strDate){ if (strDate?. ...

  5. 用Razor語法寫範本-RazorEngine組件介紹【转——非常好,可以用它来代替NVelocity】

    RazorEngine 官網網址:http://razorengine.codeplex.com 在找到RazorEngine之前曾經想過其他的方案,如T4與V8 Engine載jquery.temp ...

  6. (转)在低版本的SDK里使用高版本函数@SuppressLint("NewApi") or @TargetApi?

    @SuppressLint 和 @TargetApi达到的效果是一样的,相对于SuppressLint ,TargetApi会根据函数里使用的API,严格匹配SDK版本,给出编译错误,但是Suppre ...

  7. Haskell 与范畴论

    说到 Haskell,这真是一门逼格极高的编程语言,一般初学者如果没有相关函数式编程的经验,入门直接接触那些稀奇古怪的概念,简直要跪下.现在回想起来,隐隐觉得初学者所拥有的命令式编程语言(impera ...

  8. MyBatis知多少(16)MyBatis映射

    之前我们详细地讨论了MyBatis背后的设计理念以及iBATIS框架是如何产生的.也说明了MyBatis是一个混合型解决方案,它从处理关系数据库的其他不同方法那里借鉴了许多思想.那么MyBatis到底 ...

  9. LOD设置

    Level of detail: 使用多个不同复杂度的mesh来表示一个object,当物体离摄像机越远时,就是用更加low-detail的mesh,反之越近就越使用越精细的mesh. 组件:LOD ...

  10. Tomcat--配置tomcat,使其除了接受本地访问外,拒绝其他 IP 的访问

    解决方案:修改server.xml文件,在</host>前添加代码: <Valve className="org.apache.catalina.valves.Remote ...