Android 给广播接收器增加权限(permission)或signature签名权限

一. 普通权限

1.添加权限

当普通广播接收器需要增加权限时,需要在广播接收器所在的AndroidManifest.xml 文件中添加权限:

ini 复制代码
    <uses-permission android:name="com.android.permission.MY_PERMISSION"/>
    <permission android:name = "com.android.permission.MY_PERMISSION"/>

注:我查到的资料是在广播接收器所在的AndroidManifest.xml 文件中添加permission就行了,uses-permission是添加在广播发送方的,但在我实际调试中我发现uses-permission也得加上,否则收不到广播(注意,我调试的时候广播接收器在Android源码的SystemUI中,而发送广播则是普通的app)。

2.注册广播

如果是静态注册,则在广播接收器所在的AndroidManifest.xml 文件中,标签内注册:

ini 复制代码
<receiver android:name=".com.example.MyReceiver"
        android:exported="true"
        android:permission="com.android.permission.MY_PERMISSON">
    <intent-filter>
        <action android:name="com.my.permission" />
    </intent-filter>
</receiver>

如果广播接收器是内部类的话,则使用外部类$内部类的格式。

android:exported="true" 是 AndroidManifest.xml 文件中的一个属性,用于指示一个组件(如 Activity、Service、BroadcastReceiver 或 ContentProvider)是否可以被其他应用程序或组件访问。 如果将 android:exported 设置为 true,则该组件可以被其他应用程序或组件调用,而不需要经过授权或权限检查。这通常用于提供公共 API 或服务。 但是,如果将 android:exported 设置为 false,则该组件只能被同一应用程序中的其他组件访问,而不能被其他应用程序或组件调用。这通常用于保护应用程序的私有数据或服务。 在开发应用程序时,需要小心使用 android:exported 属性,以确保不会意外地将应用程序暴露给未经授权的访问。

如果是动态注册广播,则在onCreate()方法中注册:

scss 复制代码
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.my.permission");
    getContext().registerReceiver(new MyReceiver(), intentFilter, BROADCAST_PERMISSION, null);

其中关键点在于注册权限时传入的参数是四个。上述代码中BROADCAST_PERMISSION的就是在AndroidManifest.xml文件中自定义的权限。

arduino 复制代码
private String BROADCAST_PERMISSION = "com.android.permission.MY_PERMISSON"

上述两种方法中各选一种注册方式即可。

3.发送广播:

只需要send的时候带上接收广播需要的权限就好了。

ini 复制代码
int broadcast = 0;
Intent intent = new Intent();
intent.setAction("com.my.permission");
intent.putExtra("my broadcast", broadcast);
sendBroadcast(intent, "com.android.permission.MY_PERMISSION");

二.签名权限

1.增加权限

增加android:protectionLevel="signature" 即可:

ini 复制代码
<uses-permission android:name="com.android.permission.MY_PERMISSON"/>
<permission android:name = "com.android.permission.MY_PERMISSONT"
    android:protectionLevel="signature"/>

注册方式和发送广播的方式都不需要做改动。

在我调试的过程中,我发现,如果是静态注册 的方式注册广播,那么增加签名限制时不能使用内部类 ,否则SystemUI会崩溃,如果要使用内部类,则需要将类写为static类。而动态注册则没有这个问题。

本帖子略过了如何写广播接收器,请自行根据需求写。

2.给应用签名

在AndroidStudio中,点击build>Generate Signed Bundle/APK,根据需要选择对应选项:

然后导入需要的签名文件,输入密码:

点击next等待build成功即可。

build之后如果apk安装不上,可能需要在manifest文件中增加:android:sharedUserId="android.uid.system"。

这一行是声明app为系统级应用,如果app的签名和系统的签名是不一样,也是无法安装成功的。

举例:

ini 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="android.uid.system">

</manifest>

如有错误请指正。

相关推荐
GitLqr1 小时前
Flutter 无障碍开发实战:玩转 Semantics 解决视障用户使用痛点
android·flutter·dart
雨白5 小时前
掌握 NestedScrolling 嵌套滑动:手写仿知乎折叠主页
android
Xzaveir7 小时前
别把所有“认证”都塞进 AuthService:实名、一键登录与号码身份的领域拆分
android·人工智能
BerrySen1787 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
AFinalStone8 小时前
Android 7系统休眠唤醒(一)电源管理架构全景图
android·powermanager·电源管理
YM52e9 小时前
鸿蒙Flutter Center居中组件:Align对齐详解
android·学习·flutter·华为·harmonyos·鸿蒙
时间的拾荒人9 小时前
MySQL 视图详解
android·数据库·mysql
祉猷并茂,雯华若锦10 小时前
Appium 3.x安卓按键与通知栏操作全指南
android·appium
码农coding11 小时前
android 12 SurfaceFlinger开机启动分析
android
hunterandroid11 小时前
Paging 3 RemoteMediator 实战:构建离线优先的分页列表
android·前端