Android权限总结

摘要:
Android为我们提供了自定义权限。它必须是以下值之一:正常、危险、签名、签名或系统。根据保护级别,系统在确定是否授予权限时可能会采取不同的操作。正常表示权限风险较低,不会损害系统、用户或其他应用程序;Dangerouss表示该权限具有高风险,系统可能要求用户在授予该权限之前输入相关信息;签名意味着只有当应用程序使用的数字签名与声明许可的应用程序所用的数字签名相同时,才能授予许可;SignatureOrSystem意味着向具有相同数字签名的应用程序或android软件包类授予权限。

情况1,当程序蹦了报错

  如: java.lang.SecurityException: Permission Denial: getTasks() from pid=3391, uid=10096 requires android.permission.GET_TASKS

  这种很明显,Manifest中需要声明权限:android.permission.GET_TASKS

情况2,当程序没有的到想要的结果

  有可能就是因为没有声明权限,但是程序并没有蹦

  如权限:android.permission.WRITE_EXTERNAL_STORAGE

官方权限参考

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

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

自定义权限:暂时未用到,参考http://www.cnblogs.com/lwbqqyumidi/p/3793440.html

有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另外一个应用程序,最常见的时直接打开了另外一个应用程序,并进入其中某个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中,具有同样的权限限定,用户可以按照实际需要自定义权限,只是细节上些许不同而已。在此不做过多介绍。

免责声明:文章转载自《Android权限总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)使用 Visual Studio Code 创建并运行 Transact SQL 脚本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.NET跨平台机制一(mono for android配置教程)

    忙完了毕业设计,坐等毕业,终于有时间可以玩玩.NET的跨平台机制了,当然了.NET跨平台主要就是Linux,所以就蛮有心思的去配置了下mono for android的开发环境。       首先,准备工作要做足,运行时,虚拟机,模拟器都要先下载好了。 前期准备,先看看安卓模拟器的配置(已经会配置的略过..)配置教程网络上也很多,我这里就稍微盖过...

Android 编程下字库的使用

在安卓操作系统下对于 TextView 字体的支持很有限,默认情况下 TextView 的 typeface 属性支持 "Sans","serif","monospace" 这三种字体,假设在没有指定字体的情况下。系统缺省会使用 "Sans" 作为文本显示的字体。但这三种字体仅仅支持英文,也就是说仅仅要你显示的文字是中文,不管你选择这三种字体中的哪一种,...

H5网页在ios,android,微信中打开手机中的地图导航

需求 一个H5页面需要实现在ios的浏览器,android的浏览器以及微信中打开时支持打开手机的地图导航。 实现 let url = '' if (myBrowser1() === 'android') { // 判断是安卓环境 url = `androidamap://navi?sourceApplication=amap&poiname...

Android怎样设置圆角button

1. 在res文件夹下的drawable文件夹下新建shape.xml文件 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectan...

【移动安全高级篇】————4、Android手机一键Root原理分析

一直以来,刷机与Root是Android手机爱好者最热衷的事情。即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲。就在前天晚上,一年一度的Google I/O大会拉开了帷幕,最新的Android4.1系统成为了大会的热点,经过短短的几个小时后,网上就有人泄露了Jelly Bean的下载地址,再然后就有了Android 4.1带Root的完整...

Android—TableLayout自定义表格

最近的一个项目中,需要用的表格,由于平时很少用到表格,所以,就准备到网上搜搜,发现可参考的很少,加上,自己也想多了解点TableLayout 布局,所欲就打算自己动手来实现自己需要的表格。先看看需求吧。 如图,上面这几个表格都差不多。主要区别: 1.列数不同 2.列的宽度不一定是均分的。 谈下思路: 从图我们可以看出,表头和表格可以分为两个表。...