Activity的权限控制

原创
2016/01/18 13:41
阅读数 4.2K

Activity的权限控制


  在APK中能够通过包名+activity的类名,或者action、data启动其他应用程序中的页面。
Intent i = new Intent();
  ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings");
  i.setComponent(cn);
  i.setAction("android.intent.action.MAIN");
  startActivity(i); // or startActivityForResult(i, RESULT_OK);
  如果不希望自己APP的某些页面随便被别人调用,则可以考虑添加权限控制。
  使用系统的某些功能,我们一般都会在AndroidManifest.xml中声明所需要的权限,比如:
<uses-permission android:name="android.permission.INTERNET" />
  同样,我们也能为自己的activity声明特有的权限。android权限定义格式如下:
<permission
   android:description="string资源"
   android:icon="drawable资源"
   android:label="string资源"
   android:name="string"
   android:permissionGroup="string"
   android:protectionLevel=["normal"|"dangerous"|"signature"|"signatureOrSystem"]
/>
android:description 描述这个权限所针对的操作及用户授予这个权限的后果
icon 在询问用户是否允许安装时,显示的图片
android:label 在询问用户是否允许安装时,显示的名称
android:name 权限的唯一标识,一般都是使用包名加权限名,也是在uses-permission时声明使用的权限名
android:permissionGroup 权限所属权限组的名称 
android:protectionLevel 权限的等级,可选4种等级:normal,dangerous,signature,signatureOrSystem
可选等级:
normal 最低级别,不需要经过用户的允许,使用uses-permission之后,直接由系统授权给请求者。其用处可能就是防止其他应用query可用activity时,找到这个activity吧;
dangerous 比normal稍微高一些,在安装时会显示出来,且需要经过用户允许
signature 需要相同的签名,而且不需要经过用户的允许;
signatureOrSystem 其实和signature类似,只不过给厂商们的应用调用系统应用开了条路

  在我们需要控制权限的activity的声明中加入android:permission,照着保护等级使用即可,但想尝试几个问题
  1.signature真的是只签名相同才能打开么?能否用am命令直接调起,如果再有root权限呢?
  a)先给我们的启动activity加上签名权限(该activity具有android.intent.category.LAUNCHER)。发现安装应用后,应用icon正常,显示,但是点击后,提示应用未安装;看来系统是无权启动该activity了
b)am命令可以直接调起普通的activity,具体的可以在adb shell后输入am命令,了解基本的命令参数。
am start -n 包名/完整activity类名
  启动指定activity。但是随便给activity加个权限就会遇到java.lang.SecurityException: Permission Denial的错误。执行su命令,再次am start发现activity已经启动,而且不管什么级别都没有用。
  2.如果两个apk都启了相同的permission名,会不会有问题?能否从一个apk调用另外一个有权限的呢?
  a)首先两个应用能同时安装上,只要包名不相同
  b)其次权限声明之间不会相互冲突,应该还是依赖与应用的包名的。
展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部