2011-11-06 26 views
8

Me enfrento a un problema realmente frustrante."android.provider.Telephony.SMS_RECEIVED" no funciona en mi dispositivo (HTC Wildfire): cómo depurar?

Creé el receptor de SMS como la mayoría de los libros en línea y los tutoriales del libro dicen.

AndroidManifest.xml:

<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 

<application android:name="roboguice.application.RoboApplication" 
      android:icon="@drawable/icon" 
      android:label="@string/app_name" 
      android:debuggable="true" >  

    <!-- ... other stuffs here ... --> 

    <receiver android:name=".receivers.SmsReceiver"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
</application> 

SmsReceiver.java:

public class SmsReceiver extends BroadcastReceiver { 

    public static final String TAG = "SmsReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "SMS received!"); 
     Toast.makeText(context, "SMS received.", Toast.LENGTH_LONG).show(); 
    } 
} 

Mientras que funciona correctamente en el emulador (Android 2.2) no funciona en mi HTC Wildfire (Android 2.2 .1, no rooteado).

El principal problema es que soy nuevo en el desarrollo de Android y no tengo ni idea de cómo depurarlo.

¿Puedo encontrar algo útil con LogCat logs sendt desde mi dispositivo HTC mientras recibe un mensaje SMS? ¿Por qué mi dispositivo es diferente?

+0

La emisión de SMS está ordenada, por lo que el paso 1 consiste en arrancar la prioridad de sus receptores a algo feroz. Para ello, establezca el atributo android: priority en su filtro de intención en un valor imprudentemente alto y vuelva a probar. Pruebe algo como 2147483647. – Jens

+0

No cambia nada :(. No se muestra LogCat, no se muestra Toast, simplemente no hay nada en el dispositivo (en Emulator funciona como se esperaba). Me pregunto por qué obtengo tal registro en LogCat cuando el teléfono recibe el mensaje de sms: "11-06 23: 43: 20.540: DEPURADOR/SMSDispatcher (171): dispatchWapPushToCIQ >>>". ¿Podría ser esa la razón o algún rastro? – ncreated

+0

Hm, intente descargar un filtro SMS existente (de Market) o algo similar a su Wildfire y pruebe eso primero - podría ser algo inestable en el teléfono HTC (ha sucedido antes ...) – Jens

Respuesta

9

& Razón Solución:

tengo que corregir. "android.provider.Telephony.SMS_RECEIVED" no funcionaba porque tenía la aplicación "GO SMS Pro" instalada en mi dispositivo y había la opción "Deshabilitar notificación de otro mensaje" marcada ("Inhabilitar la notificación de otras aplicaciones relacionadas con SMS" en la barra de notificaciones, evitar notificaciones duplicadas. "). Desmarcarlo solucionó mi problema.

¿Cómo asegurarme de que mi receptor de difusión reciba esta intención, incluso si alguna otra aplicación lo bloquea? Debido a "android: priority" (Intercept SMS messages in Android and prevent them appearing in Messaging App) ¿cómo puedo saber qué "prioridad" se establece para la aplicación "GO SMS Pro"?

+0

thx, esto funciona, en la "configuración avanzada" -> "Otras configuraciones" -> (Desmarque) "Desactivar notificación de otro mensaje". –

0

Estoy bastante seguro de que este código es correcto. Es posible que no esté viendo el mensaje Toast, pero los registros habrían llegado. Compruebe el Logcat y debería ver el registro que ha puesto.

Debe usar Notifications dentro de BroadcastReceivers y no Toast s.

7

Para su Razón & Solución:

Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
List<ResolveInfo> infos = getPackageManager().queryBroadcastReceivers(intent, 0); 
for (ResolveInfo info : infos) { 
    System.out.println("Receiver name:" + info.activityInfo.name + "; priority=" + info.priority); 
} 

Y sólo tiene que buscar a través de su salida para el Pro basura GO SMS. Probablemente sea ridículamente alto.

+2

Gracias milion :)! Ahora veo que los chicos de "GO SMS Pro" hicieron dos receptores con prioridad igual al valor entero máximo (2147483647). Su aplicación probablemente está llamando abortBroadcast() en SMS_RECEIVED. Entonces, ¿hay alguna manera de que pueda luchar con su aplicación? La documentación no dice nada sobre lo que sucede cuando las prioridades son iguales, pero cuando descubrí que la aplicación "Go SMS Pro" se llama primero, consume mi intención SMS_RECEIVED y mi aplicación no se llama como resultado :(. – ncreated

+0

Se "instaló primero gana" si no recuerdo mal. La mejor apuesta es advertir al cliente que GO SMS Pro es un problema conocido (diálogo, notificación o lo que sea). – Jens

+1

Gracias de nuevo. Probablemente la mejor solución sería alguna extensión de lo que escribió: para usar el código anterior y verificar si hay otros receptores registrados para la intención de SMS_RECEIVED con máxima prioridad. Luego, advertir al usuario que las aplicaciones enumeradas podrían causar un problema. – ncreated

2

GO SMS PRO tiene prioridad es 2^31-1 = 2147483647. Por lo tanto, su aplicación no puede recibir ningún mensaje porque el servicio GO SMS canceló otras transmisiones.

Cuestiones relacionadas