消費アプリケーションのマニフェストにエントリが必要な@AARがあります。私のライブラリーのブートストラップ中に、私はAndroidManifest.xml
を必要な受信機について検査し、見つからなければ、RuntimeException
を私のライブラリーが正しく機能しないので投げます。これは99%のインストールで機能しますが、受信者がはっきりと存在する場合はRuntimeException
を投げるインストールが少数あります。マニフェストで定義されたレシーバが見つからない〜1%の時間
Android v4.4 - v5.1.1はすべてクラッシュレポートに含まれています。 Samsung、Lenovo、Nexus 4、Nexus 5などはすべて影響を受けるデバイスです。
最も興味深いのは、クラッシュの75%がルートデバイスにあることです。これは、カスタムROMまたは受信機の検出を妨害する他のアプリケーションの結果であると推測されています。
私はrooted Nexus 5 w/4.4.4でテストしても問題ありません。私は在庫Nexus 5 w/5.1.1でテストしました。うまくいきます。 CyanogenMod 12.1(最新リリース)を実行しているNexus 5でテストしたところ、正常に動作しています。私は利用可能なすべてのプライバシーガードのオプションを適用し、それでも正常に動作します。
本当に紛失して、影響を受けるユーザーを放棄したくありません。
の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()));
}
}
}
理想的には?このドキュメントでは、他にはhttp://developer.android.com/guide/topics/manifest/receiver-element.htmlと記載していますが、上記のように、このコードが実行されるデバイスの99.9%で動作します。 –