Android 的权限级别总共有4种

android:protectionLevel=[“normal” | “dangerous” | “signature” | “signatureOrSystem”]

  • normal: 低风险的权限,只要申请了就可以使用,在AndroidManifest.xml 中添加uses-permission
    标签,安装时不需要用户确认;正常的权限涵盖了应用需要访问其沙盒外部数据或者资源,但对用户的隐私或者其他应用操作风险很小。

  • dangerous: 高风险权限,安装时需要用户确认才可以使用。危险的权限常常设计用户隐私的信息,数据或者资源,或者对用户存储的数据或者其他应用的操作产生影响。

  • signature: 只有当申请权限的应用程序 (Android app) 的数字签名与 声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授予它。

这句话是什么意思呢,关于signature 的权限,举一个应用场景,其实两个app
之间是可以互相调用的,只要这两个app 是同一个开发者的签名。

  • signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)。

下面用 http://www.voidcn.com/article/p-mxagzhgo-en.html 这篇文章里面的例子来说明

权限是在signature 的情况下, 创建两个应用(App,App1)只允许具有相同的签名的广播才可以接收;

App应用创建接收广播:

public class TestBroadReceiver extends BroadcastReceiver {    //广播的Action    public static final String ACTION = "test_broad_cast_receiver";    //传递值的Key    public static final String KEY = "key";    @Override    public void onReceive(Context context, Intent intent) {        String data = "";        if (intent.hasExtra(KEY))            data = intent.getExtras().get(KEY).toString();        //接收到广播时Toast提示内容        Toast.makeText(context, context.getApplicationContext().getPackageName() + "接收静态广播" + (TextUtils.isEmpty(data) ?                "" : ",数据:" + data), Toast.LENGTH_SHORT).show();    }}

注册广播:

<receiver  android:name=".BroadcastReceiverTest.TestBroadReceiver">      <intent-filter>          <!--广播Action-->          <action android:name="test_broad_cast_receiver" />      </intent-filter></receiver>

定义权限

<!--声明一个权限--><permissions  android:name="my_permision.send_broadcast_receiver" android:protectionLevel="signature" /><!--添加权限--><uses-permission android:name="my_permision.send_broadcast_receiver" />

广播声明中添加权限

<receiver  android:name=".BroadcastReceiverTest.TestBroadReceiver" android:permission="my_permision.send_broadcast_receiver">     <intent-filter android:priority="1000">         <!--广播运用权限-->         <action android:name="test_broad_cast_receiver" />     </intent-filter></receiver>

先在本应用中测试,期望会弹出带有“来自app测试”的Toast

private void sendStaticBroadCast() {        Intent intent = new Intent();        //传递数值        intent.putExtra("key", "来自app测试");        intent.setAction(TestBroadReceiver.ACTION);        sendBroadcast(intent);    }

打包签名

测试结果:
再创建测试App1应用,发送广播“test_broad_cast_receiver”

private void sendStaticBroadCast() {        Intent intent = new Intent();        //传递数值        intent.putExtra("key", "来自app1测试");        intent.setAction("test_broad_cast_receiver");        sendBroadcast(intent);    }

配制文件中设置(这里一定要添加上面自定义的权限):

<!--必须添加App应用中定义的权限--><uses-permission android:name="my_permision.send_broadcast_receiver" />

打包签名

测试结果:

打开应用时立即发送广播,app1 能够接受广播。

再次测试使用不同的签名,生成app1 打开app1,就没有触发广播接收方法了。


Reference

http://www.voidcn.com/article/p-mxagzhgo-en.html


写在后面的话

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian

更多相关文章

  1. Android核心模块及相关技术
  2. Android翻译:应用程序的生命周期 kill进程
  3. Android核心模块内容概述
  4. Android开发艺术探索读书笔记(第二章)
  5. android笔试题
  6. 【Flutter开发】------修改图标、应用名称、包名等
  7. AndroidMenifest.xml中android:sharedUserId="android.uid.syste
  8. Android(安卓)ORM 框架之 Android中ORMLite应用基础
  9. Android安卓应用版本命名规范

随机推荐

  1. ListView的Adapter使用(绑定数据) 之 自
  2. Android(安卓)中倒计时验证两种常用方式
  3. Android(安卓)SQLite数据库使用INTO子句
  4. Android(安卓)中能够作为 Log 开关的一些
  5. Android(安卓)Studio Git .gitignore规则
  6. Android(安卓)基础—— 对Context的理解
  7. Android(安卓)压缩网络上的图片BitmapFac
  8. Android(安卓)NDK开发 Cmake环境调用 so
  9. Android(安卓)异步查询 AsyncQueryHandle
  10. [android] android开发中常用的Eclipse快