2012-02-21 2 views
6

Ho un ricevitore di trasmissione SMSApp che onReceive legge bundleExtra dall'intenzione. Qui, come posso leggere il numero di telefono da bundleExtras?Android: come ottenere il numero di telefono da un SMS in arrivo?

if(intent.getAction().equals(SMS_RECEIVED)) 
{ 
    Bundle bundleExtras = intent.getExtras(); 
    if (bundleExtras != null) 
    { 

    } 
} 
+0

possibile duplicare http://stackoverflow.com/questions/5692354/in-android-how-should-i-get-phone-number-of -sms-sender –

+0

@sergeybenner grazie –

risposta

9
Bundle bundle = intent.getExtras(); 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      final SmsMessage[] messages = new SmsMessage[pdus.length]; 
      for (int i = 0; i < pdus.length; i++) { 
       messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      } 

Ora, messages[0].getOriginatingAddress() è l'indirizzo e messages[0].getMessageBody() è il corpo del messaggio.

+0

grazie che ha funzionato –

0

Questo è un link ad una dettagliata "come inviare e ricevere messaggi SMS", si dovrebbe verificare, è completa e piena di esempi:

http://mobiforge.com/developing/story/sms-messaging-android

anche di utilizzare questo link, è possibile fare:

if (bundle != null) { 
    SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent); 
    for (int i = 0; i &lt; messages.length; i++) { 
     SmsMessage message = messages[i]; 
     buf.append("Received SMS from "); 
     buf.append(message.getDisplayOriginatingAddress()); 
     buf.append(" - "); 
     buf.append(message.getDisplayMessageBody()); 
    } 
} 
+0

questo non ha funzionato per me, il compilatore non riconosce la classe di telefonia. C'è qualcosa di sbagliato in: Telephony.Sms.Intents.getMessagesFromIntent (intent); –

4

Tutorial a http://ukitech.blogspot.com/2014/11/android-sms-app.html

USCITA:

SmsReceiver.processReceivedSms: SMS dal + 1650815xxxx

SmsReceiver.processReceivedSms: SMS corpo di prova 4

/** * Creato da Uki sulla 11/22/14. */

public class SmsReceiver estende BroadcastReceiver {

@Override 
     public void onReceive(Context context, Intent intent) { 
      final String tag = TAG + ".onReceive"; 
      Bundle bundle = intent.getExtras(); 
      if (bundle == null) { 
        Log.w(tag, "BroadcastReceiver failed, no intent data to process."); 
        return; 
      } 
      if (intent.getAction().equals(SMS_RECEIVED)) { 
        Log.d(tag, "SMS_RECEIVED"); 

        String smsOriginatingAddress, smsDisplayMessage; 

        // You have to CHOOSE which code snippet to use NEW (KitKat+), or legacy 
        // Please comment out the for{} you don't want to use. 

        // API level 19 (KitKat 4.4) getMessagesFromIntent 
        for (SmsMessage message : Telephony.Sms.Intents. 
              getMessagesFromIntent(intent)) { 
         Log.d(tag, "KitKat or newer"); 
         if (message == null) { 
           Log.e(tag, "SMS message is null -- ABORT"); 
           break; 
         } 
         smsOriginatingAddress = message.getDisplayOriginatingAddress(); 
         //see getMessageBody(); 
         smsDisplayMessage = message.getDisplayMessageBody(); 
         processReceivedSms(smsOriginatingAddress, smsDisplayMessage); 
        } 

        // Processing SMS messages the OLD way, before KitKat, 
        // this WILL work on KitKat or newer Android 
        // PDU is a “protocol data unit”, which is the industry 
        // format for an SMS message 
        Object[] data = (Object[]) bundle.get("pdus"); 
        for (Object pdu : data) { 
         Log.d(tag, "legacy SMS implementation (before KitKat)"); 
         SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); 
         if (message == null) { 
           Log.e(tag, "SMS message is null -- ABORT"); 
           break; 
         } 
         smsOriginatingAddress = message.getDisplayOriginatingAddress(); 
         // see getMessageBody(); 
         smsDisplayMessage = message.getDisplayMessageBody(); 
         processReceivedSms(smsOriginatingAddress, smsDisplayMessage); 
        } 
      } // onReceive method