权限是一种安全机制。Android权限主要用于限制应用程序内部某些具备限制性特性的功能使用以及应用程序之间的组件访问。在Android开发中,基本上都会遇到联网的需求,咱们知道都须要加上联网所须要的权限:html
1 <uses-permission android:name="android.permission.INTERNET" />
实际上,在开发过程当中,当咱们使用了某些系统特性的功能,且此类特性须要包含相应权限时,若是在AndroidManifest.xml文件中相应申明,则会运行错误且提示:java.lang.SecurityException: Permission Denial ...java
根据此错误提示,通常状况下,在AndroidManifest.xml中经过 uses-permission 增长上相应权限便可。android
1、Android权限列表:安全
那么,Android中有哪些受限制性访问的特性呢?具体的特性对应所须要的权限名称又是什么呢?具体能够在Android官方文档中查的。ide
http://developer.android.com/reference/android/Manifest.permission.htmlspa
须要注意的是,不一样的权限可能对应了不一样的API等级,所以,可能会出现兼容性问题。code
2、Android自定义权限:orm
有时候,咱们可能遇到以下需求场景:当用户在一个应用程序中进行某项操做时,会启动另一个应用程序,最多见的时直接打开了另一个应用程序,并进入其中某个Activity(如:有的应用中有推荐应用列表,当用户点击时程序会首先判断其余应用有无安装,若无则提示用户下载,若有则直接打开进入)。有时候,处于安全等须要,此类操做须要加上受限制性的访问限制,那么怎么办呢?Android中为咱们提供了自定义权限。xml
为了讲清自定义权限,先以不一样的程序之间访问Activity增长权限限制为例。假设应用程序A中有MainActivity,应用程序B中有AActivity和BActivity。如今想经过A中的MainActivity直接打开B中的BActivity。htm
那么,若是不考虑权限,A中的MainActivity如何直接打开B中的BActivity呢?通常,能够经过以下方式:
1 public class MainActivity extends Activity { 2
3 private Button button; 4
5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9
10 button = (Button)findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() { 12 @Override 13 public void onClick(View v) { 14 Intent intent = new Intent(); 15 intent.setClassName("com.example.testandroid", "com.example.testandroid.BActivity"); 16 startActivity(intent); 17 } 18 }); 19 } 20 }
这段代码很好理解,主要是经过Intent中的setClass(String packageName, String className)方法,须要注意的是此时须要写上包的全名。同时,针对B中的BActivity须要在AndroidManifest.xml文件中进行以下配置:
1 <activity 2 android:name="com.example.testandroid.BActivity"
3 android:exported="true" >
4 </activity>
必定要为Activity中的属性android:exported设置值为true,以表示能够被其余应用程序打开。或者,也能够进行以下配置:
1 <activity 2 android:name="com.example.testandroid.BActivity" >
3 <intent-filter>
4 <action android:name="" />
5 </intent-filter>
6 </activity>
为Activity设置一个空的action android:name属性。
至此,咱们尚未用到自定义权限。假设如今须要对外部应用程序直接打开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 | 义与权限相关的"风险级别"。必须是如下值之一: |
是 |
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中,具备一样的权限限定,用户能够按照实际须要自定义权限,只是细节上些许不一样而已。在此不作过多介绍。