2011-11-30 5 views
21

Sto cercando di utilizzare android.provider.Telephony.SMS_RECEIVED per catturare gli SMS in arrivo.SMS_RECEIVED non funziona su Ice Cream Sandwich?

Ho creato una semplice app, che funziona su 2.x, ma quando provo sul mio emulatore 4.0 o dispositivo, non funziona.

Qualche idea?

manifesto:

<?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

Si sta utilizzando un dispositivo reale o l'emulatore? – rekire

+0

@rekire entrambi su 4.0. Ho anche provato l'emulatore in 2.3, e questo funziona. – giggsey

+0

Ho cambiato il nome del destinatario in una classe che non esiste e non fa ancora nulla (nessun errore nel logcat). Quindi sto pensando che non è neanche troppo lontano.Quindi o non sta sparando quell'intenzione (improbabile), o non sta usando la mia App (probabilmente) – giggsey

risposta

4

Assicurarsi che in realtà si sta creando e registrando il ricevitore in un'attività o un servizio, altrimenti non verrà chiamato (credo).

Un esempio molto semplice di questo potrebbe essere:

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

non posso promettere questo lavoro, ma credo che risolverà alcune cose. Se avete domande su cose, basta chiedere nei commenti. Credo che tu abbia ragione nel dire che non viene nemmeno chiamato perché il tuo ricevitore non è registrato a nulla. Se vuoi che funzioni in background, considera l'utilizzo di un servizio. Spero davvero che questo aiuti e buona fortuna per i tuoi sforzi!

+0

Grazie Matt, è stato così. Scusa se non hai ricevuto il premio, non lo hai controllato fino a dopo la scadenza (altri impegni) – giggsey

+2

Tutto bene, È interessante notare che c'è di più nella vita di programmazione: 0) – Matt

+0

A staticamente re gistered Receiver non ha bisogno di essere registrato dinamicamente. [Questo post] (http://stackoverflow.com/questions/7349173/android-xoom-honeycomb-application-without-launcher-activity-does-not-work/7350165#7350165) collegato da @Gaurav nei commenti sopra descrive il vero problema in questo caso. –

0

penso che il vostro errore è di utilizzare il nome della classe nel nome del pacchetto.

Nel tuo manifest hai scritto package="com.giggsey.MyFirstApp" e anche <receiver android:name=".MyFirstApp"> nel tuo ricevitore. Ciò significherebbe che il nome completo del tuo ricevitore è com.giggsey.MyFirstApp.MyFirstApp, ma credo che sia solo com.giggsey.MyFirstApp.

Scambio com.giggsey.MyFirstApp nel file manifest con com.giggsey che potrebbe funzionare se credo di aver ragione.

<?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"> 
[...] 

E anche questo:

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

provato sia con com.giggsey come il pacchetto, e il percorso completo (com.giggsey.MyFirstApp.MyFirstApp nel ricevitore e nessuno dei due ha funzionato :( – giggsey

+0

Sembra il tuo 'MyFirstApp.java' come sopra modificato? – rekire

+0

Ho provato questo, e ancora no. – giggsey

-2

in in ricezione si prega di cercare di aggiungere la seguente riga

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, nessun popup popup. – giggsey

+3

Toast debugging, la caratteristica killer nello sviluppo di Android – rds

1

È sufficiente esportare il valore true per il destinatario.

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

nel caso in cui si tenta "catturare" in backgroung si possono vedere this post.

"android.provider.Telephony.SMS_RECEIVED" ottimo da Servizio. altrimenti solo durante l'attività del ciclo di vita è possibile "catturare" lo

+0

Per me funziona benissimo – itzhar

+0

Spiacente, dovrei essere stato specifico. "altrimenti solo durante il ciclo di vita dell'attività è possibile" catturarlo ". Questa parte non è corretta. La registrazione dinamica del ricevitore funzionerà, a condizione che il componente di registrazione sia attivo al momento del ricevimento. Tuttavia, il ricevitore non ha bisogno di essere registrato dinamicamente. La registrazione statica nel manifest è valida. Il problema in questo caso è descritto in [questo post] (http://stackoverflow.com/questions/7349173/android-xoom-honeycomb-application-without-launcher-activity-does-not-work/7350165#7350165) linkato da @Gaurav nel loro commento sulla domanda. –

+0

No. Il tuo collegamento non descrive il mio problema e la soluzione. Ricevitore manifest statico NON funziona. – itzhar

-1

Questo può aiutare you..try questo .. In classe ricevitore 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(); 
    }