Android如何实现仅接收指定包名应用发送的广播?
接收端校验广播发送方包名的实现方案
前置修正:发送端代码错误修复
发送端原有代码中setPackage参数写了多余的package前缀和分号,会导致广播无法正常发送到接收端,修正后代码如下:
package com.sender.app; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(); intent.putExtra("version", BuildConfig.VERSION_NAME); intent.setAction("get.sender.app.version"); // 修正setPackage参数,只填接收端包名即可 intent.setPackage("com.receiver.app"); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); sendBroadcast(intent); }
核心实现:接收端添加包名校验逻辑
你可以直接在广播接收器的onReceive方法中获取广播发送方的包名,判断是否为指定的com.sender.app,仅匹配通过后再执行后续逻辑,兼容全Android版本的实现代码如下:
package com.receiver.app; public class BroadcastReceiver_GetSenderAppVersion extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 校验发送方包名逻辑 String senderPackage = null; // API 30及以上直接用系统提供的getSendingPackage方法 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { senderPackage = getSendingPackage(); } else { // 低版本通过发送方UID查询包名 int senderUid = getSendingUid(); if (senderUid >= 0) { String[] packages = context.getPackageManager().getPackagesForUid(senderUid); if (packages != null && packages.length > 0) { senderPackage = packages[0]; } } } // 仅当包名匹配、携带有效版本号时才展示Toast if ("com.sender.app".equals(senderPackage) && intent.hasExtra("version") && intent.getStringExtra("version") != null && intent.getStringExtra("version").length() > 0) { Toast.makeText(context, intent.getStringExtra("version"), Toast.LENGTH_LONG).show(); } } }
可选优化(安全性升级)
如果要避免包名伪造的风险,你可以额外校验发送端应用的签名,确保广播来源是官方的发送端应用。
内容的提问来源于stack exchange,提问作者Nikhil Reddy
相关产品推荐
相关产品推荐

