Android 权限

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

1 <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呢?一般,可以通过如下方式:

 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
义与权限相关的"风险级别"。必须是以下值之一:
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中,具有同样的权限限定,用户可以按照实际需要自定义权限,只是细节上些许不同而已。在此不做过多介绍。

时间: 2024-10-16 18:17:35

Android 权限的相关文章

android权限大全

android权限大全 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位

android权限--android开发中的权限及含义(上)

android权限--android开发中的权限及含义(上) android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯 android.pe

Android权限列表permission说明

网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: < uses-permission   android:name ="android.permission.INTERNET"  /> 注意在<application>也可以定义INTERNET权限,如下: < application   android:per

Android权限Permission详解

android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.INSTALL_PACKAGES 允许一个程序安装packages android.permission.INTERNAL_SYSTEM_WINDOW 允许打开窗口使用系统

Android权限机制(三) 针对权限控制如何设计App

随着Android 5.0的到来,原生的权限管理控制功能AppOps终于登场(虽然4.3的代码中已经包含). 它的使用路径是Settings -> Security -> AppOps(有些厂商的ROM可能依然屏蔽着,或名字被修改) AppOps引进的一个新概念"Ops",也就是"Operations"操作.之前的第三方应用(如LBE)和手机厂商ROM(三星.MIUI),都实现了类似功能,但强调的是permission权限.而在AppOps中,ops操作

Android笔记(七十三) Android权限问题整理 非常全面

Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~150

Android 权限整理

抽空整理,以备以后查看 android权限大全 android.permission.WRITE_APN_SETTINGS:允许程序写入APN设置(4.0后已经被禁用) android.permission.WRITE_CALENDAR:允许一个程序写入但不读取用户日历数据 android.permission.WRITE_CONTACTS:允许程序写入但不读取用户联系人数据 android.permission.WRITE_GSERVICES:允许程序修改google地图服务 android.

Android Permission denied 错误 ( 附Android权限大全 )

Android Permission denied 错误(附Android权限大全) java.net.SocketException: Permission denied (maybe missing INTERNET permission) 这是一个经典错误, Socket不能对外连接,错误不会被报出,调试的时候,能看到Exception, 这个Exception会有非常多变体. Android默认不同意訪问网络,所以,在AndroidManifest.xml中,须要进行例如以下配置: <u

Android权限管理原理(含6.0-4.3)

Android 4.3-5.1 AppOpsManager动态权限管理(官方不成熟的权限管理) AppOpsManager 是Google在Android4.3-Android5.0引入的动态权限管理方式,但是又与Google觉得不成熟,所以在每个发行版的时候,总是会将这个功能给屏蔽掉.国内一些早期版本的权限动态管理的表现类似,这里用CyanogenMod12里面的实现讲述一下,国内的ROM源码拿不到,不过从表现来看,实现应该类似. 在一开始,其实Google将权限的动态管理放在每个服务内部,类