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>

如有错误请指正。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui