gpt4 book ai didi

android - 大约 1% 的时间找不到 list 定义的接收者

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:44 25 4
gpt4 key购买 nike

我有一个@AAR,需要在消费应用程序的 list 中输入一个条目。在我的库的引导过程中,我检查了 AndroidManifest.xml 以查找所需的接收器,如果我找不到它,我会抛出一个 RuntimeException,因为我的库将无法正常运行。这适用于 99% 的安装,但有少数安装会在接收器明显存在时抛出此 RuntimeException

Android v4.4 - v5.1.1 都包含在崩溃报告中。三星、联想、Nexus 4、Nexus 5 等都是受影响的设备。

最有趣的线索是,大约 75% 的崩溃发生在获得 root 权限的设备上。据推测,这是某些自定义 ROM 或干扰接收器检测的其他应用程序的结果。

我已经使用带 root 权限的 Nexus 5 w/4.4.4 进行了测试,它运行良好。我已经使用带 5.1.1 的库存 Nexus 5 进行了测试,它工作正常。我已经使用运行 CyanogenMod 12.1(最新版本)的 Nexus 5 进行了测试,它运行良好。我应用了所有可用的 Privacy Guard 选项,它仍然可以正常工作。

真的很茫然,不想放弃受影响的用户。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<application>
<receiver
android:name="com.example.MyBroadcastReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

<category android:name="${applicationId}" />
</intent-filter>
</receiver>
<!-- Activities, etc. removed for brevity -->
</application>
</manifest>

public class CheckSetup {

// Other methods removed for brevity

public void checkManifest() {
List<ResolveInfo> receiversInfo;

Intent checkIntent = new Intent(applicationContext, MyBroadcastReceiver.class);
receiversInfo = packageManager.queryBroadcastReceivers(checkIntent, 0);

boolean receiverFound = false;

if (receiversInfo != null) {
for (ResolveInfo resolveInfo : receiversInfo) {
if (resolveInfo.activityInfo != null && resolveInfo.activityInfo.name.equals(MyBroadcastReceiver.class.getName()) && resolveInfo.activityInfo.packageName.equals(packageName)) {
receiverFound = true;
}
}
}

if (!receiverFound) {
throw new RuntimeException(String.format("%s definition not found in AndroidManifest.xml", MyBroadcastReceiver.class.getName()));
}
}
}

最佳答案

我能够重现此行为的唯一方法是安装允许我有选择地禁用 ServicesReceivers 的第 3 方应用程序。我不确定为什么有人会想要这样做,一旦被禁用,就无法从我的 AAR 中重新启用它们。

最好的情况是在开发期间抛出异常并简单地输出到 LogCat 以用于生产签名版本。

可以在此处找到此类应用程序的示例:

https://play.google.com/store/apps/details?id=cn.wq.myandroidtools

关于android - 大约 1% 的时间找不到 list 定义的接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32523690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com