Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


No se puede encontrar el receptor definido Definido ~ 1% del tiempo

Tengo un @AAR que requiere una entrada en el manifiesto de la aplicación de consumo. Durante el bootstrapping de mi biblioteca inspecciono el AndroidManifest.xml para el receptor requerido y si no puedo encontrarlo arrojo una RuntimeException ya que mi biblioteca no funcionará correctamente. Esto funciona en el 99% de las instalaciones, pero hay un pequeño número de instalaciones que lanzan esta RuntimeException cuando el receptor claramente existe.

Android v4.4 – v5.1.1 están incluidos en los informes de fallos. Samsung, Lenovo, Nexus 4, Nexus 5, etc. son todos los dispositivos afectados.

La pista más interesante es que ~ 75% de los accidentes están en dispositivos con raíces. La especulación ha sido que esto es el resultado de alguna ROM personalizada o alguna otra aplicación que está interfiriendo con la detección del receptor.

He probado con una raíz Nexus 5 w / 4.4.4 y funciona bien. He probado con una acción Nexus 5 w / 5.1.1 y funciona bien. He probado con un Nexus 5 CyanogenMod 12.1 (última versión) y funciona bien. He aplicado todas las opciones de Privacy Guard disponibles y todavía funciona bien.

Realmente en una pérdida y no quieren abandonar a los usuarios afectados.

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> 

Clase

 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())); } } } 

  • Registro y cancelación del registro de BroadcastReceiver en un fragmento
  • El receptor de difusión de Android no funciona
  • Intercepte INSTALL_REFERRER y luego adelante a Google AnalyticsReceiver
  • Cambio de volumen Listener: ¿Es preferible registerMediaButtonEventReceiver a onKeyDown?
  • Incorrectos extras recibidos con todos los intentos, pero el primero
  • ¿Cuál es la forma correcta de iniciar una comunicación de red basada en recibir una intención de difusión?
  • Android - "El receptor exportado no requiere permiso" en receptores destinados a recibir de los servicios del sistema
  • Instancia diferente de Applicationcontext en Broadcastreceiver
  • 2 Solutions collect form web for “No se puede encontrar el receptor definido Definido ~ 1% del tiempo”

    La única manera que he podido reproducir este comportamiento es instalando una aplicación de terceros que me permite desactivar de forma selectiva Services y Receivers . No estoy seguro de por qué alguien querría hacer esto y una vez desactivado no hay forma de volver a habilitarlos desde mi AAR.

    El mejor caso ha sido lanzar una excepción durante el desarrollo y simplemente la salida a LogCat para la producción de lanzamientos firmados.

    Un ejemplo de tal aplicación se puede encontrar aquí:

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

    ¿Se puede eliminar android: exportado = "true" y comprobar? Idealmente android: exportado debe ser falso.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.