2011-11-30 18 views
21

Estoy tratando de usar android.provider.Telephony.SMS_RECEIVED para capturar los SMS entrantes.SMS_RECEIVED no funciona en Ice Cream Sandwich?

Creé una aplicación simple, que funciona en 2.x, pero cuando lo pruebo en mi emulador 4.0 o dispositivo, no funciona.

¿Alguna idea?

Manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.giggsey.MyFirstApp" android:versionCode="1" 
android:versionName="1.0"> 
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> 


    <receiver android:name=".MyFirstApp"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
     </intent-filter> 
    </receiver> 
</application> 
<uses-sdk android:minSdkVersion="9" /> 


<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
</manifest> 

MyFirstApp.java

public class MyFirstApp extends BroadcastReceiver { 

    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
    private static final String TAG = "MyFirstApp"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i(TAG, "Intent recieved: " + intent.getAction()); 
    } 
} 
+0

¿Está utilizando un dispositivo real o el emulador? – rekire

+0

@rekire ambos en 4.0. También probé el emulador en 2.3, y eso funciona. – giggsey

+0

Cambié el nombre del receptor a una clase que no existe, y todavía no hace nada (no hay errores en el logcat). Así que estoy pensando que ni siquiera está llegando tan lejos.Entonces o no está disparando esa intención (improbable), o no está usando mi aplicación (probable) – giggsey

Respuesta

4

Asegúrese de que en realidad está creando y registrando el receptor en una actividad o un Servicio, de lo contrario no se llamará (creo).

Un ejemplo muy simple de esto podría ser:

public class MyActivity extends Activity { 

    private BroadcastReceiver receiver; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
     //Extends BroadcastReceiver 
     receiver = new MyFirstApp(); 
     registerReceiver(receiver,filter); 
    } 


    //Also, to save headaches later 
    @Override 
    protected void onDestroy() { 
     unregisterReceiver(receiver); 
    } 
} 

No puedo prometer que esto funcionará, pero creo que va a arreglar algunas cosas. Si tiene alguna pregunta sobre cosas, solo pregunte en comentarios. Creo que tienes razón al decir que ni siquiera se llama porque tu receptor no está registrado para nada. Si desea que se ejecute en segundo plano, considere usar un servicio. ¡Realmente espero que esto ayude y la mejor de las suertes con tus esfuerzos!

+0

Gracias Matt, esto fue. Lo siento, no obtienes la recompensa, no compruebas hasta después de que haya expirado (otros compromisos) – giggsey

+2

Todo bien, curiosamente hay más en la vida que programación: 0) – Matt

+0

A estático re El receptor registrado no necesita ser registrado dinámicamente. [Esta publicación] (http://stackoverflow.com/questions/7349173/android-xoom-honeycomb-application-without-launcher-activity-does-not-work/7350165#7350165) vinculada por @Gaurav en los comentarios anteriores describe el problema real en este caso. –

0

creo que el error es que se utiliza el nombre de clase en el nombre del paquete.

En su manifiesto, usted escribió package="com.giggsey.MyFirstApp" y también <receiver android:name=".MyFirstApp"> en su receptor. Esto significa que el nombre completo de su receptor es com.giggsey.MyFirstApp.MyFirstApp, pero creo que es solo com.giggsey.MyFirstApp.

Intercambio com.giggsey.MyFirstApp en su manifiesto con com.giggsey que debería funcionar si lo creo correcto.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.giggsey" android:versionCode="1" android:versionName="1.0"> 
[...] 

Y también esto:

package com.giggsey; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class MyFirstApp extends BroadcastReceiver { 
    private static final String TAG = "MyFirstApp"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i(TAG, "Intent recieved: " + intent.getAction()); 
    } 
} 
+0

intentado con tanto com.giggsey como el paquete, y la ruta completa (com.giggsey.MyFirstApp.MyFirstApp en el receptor, y ninguno funcionó :( – giggsey

+0

Parece que su 'MyFirstApp.java' como se editó anteriormente? – rekire

+0

Probé eso, y todavía no. – giggsey

-2

en el en recepción por favor, trate de añadir la siguiente línea

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

if (intent.getAction() == SMS_RECEIVED) { 
    //any action you want here.. 
    Toast.makeText(MyClass.this, "SMS RECEIVED",Toast.LENGTH_LONG).show(); 
} 
+0

No, no toast popup. – giggsey

+3

Toast la depuración, la característica asesina en el desarrollo de Android – rds

1

Solo necesita exportar el valor verdadero para el receptor.

<receiver android:name=".MyFirstApp" exported="true"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
     </intent-filter> 
</receiver> 
0

en caso de que intente "captura" en backgroung se puede ver this post.

"android.provider.Telephony.SMS_RECEIVED" funcionan muy bien desde Servicio. de otro modo sólo durante la actividad del ciclo de vida se puede "atrapar" que

+0

Para mí funciona genial – itzhar

+0

Lo siento, debería haber sido específico. "de lo contrario, solo durante el ciclo de vida de la actividad puede" atraparlo "- Esta parte no es correcta. El registro dinámico del Receptor funcionará, siempre que el componente de registro esté activo en el momento de la recepción. Sin embargo, el receptor no necesita ser registrado dinámicamente. El registro estático en el manifiesto es válido. El problema en este caso se describe en [esta publicación] (http://stackoverflow.com/questions/7349173/android-xoom-honeycomb-application-without-launcher-activity-does-not-work/7350165#7350165) linked por @Gaurav en su comentario sobre la pregunta. –

+0

No. Su enlace no describe mi problema y solución. Static manifest reciever NO funciona. – itzhar

-1

Esto puede ayudar a you..try esta .. En la clase de receptor brodcast

public static final String SMS_BUNDLE = "pdus"; 


public void onReceive(Context context, Intent intent) 
{ 

    Bundle intentExtras = intent.getExtras(); 
     if (intentExtras != null) { 
      Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE); 
      String smsMessageStr = ""; 
      for (int i = 0; i < sms.length; ++i) { 
       SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]); 

       smsBody = smsMessage.getMessageBody().toString(); 
       address = smsMessage.getOriginatingAddress(); 

       smsMessageStr += "SMS From: " + address + "\n"; 
       smsMessageStr += smsBody + "\n"; 
      } 
      Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show(); 
    } 
Cuestiones relacionadas