Habilitar el soporte de SMS en Hangouts 2.0 rompe el BroadcastReceiver de SMS_RECEIVED en mi aplicación

Acabo de recibir la actualización de Hangouts 2.0, la instalé y habilité SMSTurn on SMS . Ahora mi aplicación, que funciona bajo Android 4.3, no puede recibir SMS más, es decir mi BroadcastReceiver para SMS_RECEIVED ya no se llama. Unesdoc.unesco.org

Tan pronto como inhabilito Turn on SMS en Hangouts 2.0, mi aplicación puede recibir SMS_RECEIVED nuevamente.

El receptor de difusión está registrado en el Manifiesto como este

AndroidManifest.xml

 … <receiver android:name=".SMSReceiver" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> … 

SMSReceiver.java

 public class SMSReceiver extends BroadcastReceiver { private static final Log LOG = Log.getLog(); @Override public void onReceive(Context context, Intent intent) { LOG.d("onReceive"); … } } 

Ya he intentado cambiar la prioridad del receptor a INT_MAX o 999, que es la prioridad más alta posible de la documentación de filtro de intención , pero sin éxito. Sé que SMS_RECEIVED intenciones SMS_RECEIVED se envían ordenadas y que las aplicaciones de alta prioridad tienen la capacidad de abortar la transmisión. 1 Pero parece improbable que Hangouts 2.0 registre el receptor SMS_RECEIVED con una alta prioridad y llame a abortBroadcast() , por lo tanto, evitando que cualquier otra aplicación reciba la intención.

Lo que más me confundió, es que mi Pebble sigue siendo capaz de recibir SMS, incluso con Hangouts 2.0 como aplicación predeterminada de SMS. Me pregunto qué Pebble hace diferente? Acabo de notar que la notificación SMS entrante en mi Pebble ya no son notificaciones de SMS nuevos que son recibidos por la aplicación Pebble, sino que son notificaciones de "nuevo mensaje de Hangout" que son causadas por hangouts que reciben los SMS entrantes. Por lo tanto, la aplicación Pebble tampoco puede recibir mensajes de texto entrantes con SMS_RECEIVED .

En una nota de lado y no realmente relacionados con este problema, porque todavía estoy en Android 4.3 (pero mi aplicación se dirige al nivel SDK 19, Android 4.4 en caso de que importe) Google Android Developers Blog post sobre el nuevo SMS API en Kitkat , dijo que Nada cambiará para las aplicaciones que utilizan sólo SMS_RECEIVED y no intente escribir el SMS en el proveedor de SMS.

1 Siempre creí que la transmisión SMS_RECEIVED es abortable. Pero el sitio de las APIs de Android 4.4 dice algo diferente: "… cuando un nuevo SMS llega escuchando la emisión SMS_RECEIVED_ACTION, que es una emisión no abortable …"

Arreglado.

El primer problema fue que, como se puede ver en la revisión 2 de mi pregunta , pongo el atributo de priority dentro del elemento de action , cuando en realidad pertenece al elemento de intent-filter . Así que la prioridad no funcionó.

Mientras seguía apuntando a API 19, hice algunas experiencias con Hangouts habilitados para SMS y prioridades diferentes.

  • No se establece ninguna prioridad → BroadcastReceiver no recibe la intención SMS_RECEIVED
  • Priority 500 → BroadcastReceiver recibe la intención SMS_RECEIVED
  • Prioridad 999 1 → BroadcastReceiver recibe la intención SMS_RECEIVED

Por lo tanto, parece que debe tener un valor mínimo de prioridad para obtener la intención con Hangouts SMS habilitado. No me molesté en biseccionar el valor más bajo posible. 😉 Voy con 999 como no veo ninguna razón para bajar porque mi aplicación hace sólo algunas comprobaciones rápidas sobre los sms recibidos y no procesarla más. Pero realmente debería hacer una diferencia, ya que la emisión no es abortable.

1 El valor máximo

Según el Manifiesto más reciente de Hangouts de Google, tienen un conjunto AbortSmsReceiver con una prioridad de "3", por lo que parece que cualquier aplicación que desee recibir la transmisión SMS_RECEIVED en la API 18 o inferior debe utilizar una prioridad superior a 3:

 <receiver android:name="com.google.android.apps.babel.sms.AbortSmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:enabled="false"> <intent-filter android:priority="3"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

Puede utilizar un objetivo de compilación de API 19. Las aplicaciones en un dispositivo que ejecute API 19 (KitKat) no podrán anular la difusión como en las API anteriores. Esto evita que las aplicaciones realicen un aborto prematuro.

Supongo que incluyeron este aborto para evitar que las aplicaciones de mensajería de stock de publicar notificaciones duplicadas. Las aplicaciones de mensajería de valores deben procesarse en la prioridad 0 antes de KitKat, pero cualquier aplicación que no establezca una prioridad se procesa a 0 también. Los objetos IntentFilter se crean con un valor de prioridad predeterminado de "0":

 public IntentFilter() { mPriority = 0; mActions = new ArrayList<String>(); } 

Todavía puedo conseguir la multa de difusión. Acaba de instalar los nuevos hangouts y activó SMS. En mi caso, sólo estoy leyendo el contenido de SMS y eso sigue funcionando. Lo que he hecho, sin embargo, fue establecer la prioridad de la intención de filtro a 999 después de un hilo anterior aquí :

 <intent-filter android:priority="999" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> 

Tal vez eso está jugando un papel?

ACTUALIZACIÓN: Acabo de leer que cambió su objetivo a SDK nivel 19. En ese caso, he leído que usted tiene que cambiar la forma en que su aplicación se comporta (no puede encontrar el enlace ahora) siguiendo las directrices de la API 19. Cambie su objetivo a 18 y debería funcionar bien.

Estoy teniendo el mismo problema. Estoy orientado a sdk 17 y todavía no puedo obtener la transmisión si Hangouts está habilitado para manejar SMS. Quién sabe cuántas aplicaciones Hangouts acaba de romper en el mercado.

Voy a tratar de ajustar la prioridad y ver si eso ayuda.

Yup, la prioridad lo fijó para mí en el sdk de la blanco 17. ¡gracias!

Cuando registre el receptor, establezca la prioridad del filtro en INTEGER.MAX_VALUE. Ahora abortBroadcast () funcionará;

 receiver = new HightPrioritySmsReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(Integer.MAX_VALUE); registerReceiver(receiver, filter); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.