2013-10-18 59 views
6

我從收到原始短信中找到收件人電話號碼時遇到問題。這裏是我試圖的代碼:Android:如何從原始短信獲取發件人和收件人電話號碼

有人可以告訴我如何從原始短信中檢索接收方的電話號碼。

public class SMSReceiver extends BroadcastReceiver { 

private Context context; 

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    // Parse the SMS. 
    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    if (bundle != null) 
    { 
     // Retrieve the SMS. 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i=0; i<msgs.length; i++) 
     { 
      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
      //appending to str String. 
      str += "OriginatingAddress: "; 
      str += msgs[i].getOriginatingAddress(); 
      str += " :\n"; 
      str += " :\n"; 
      str += "DisplayOriginatingAddress: "; 
      str += msgs[i].getDisplayOriginatingAddress(); 
      str += " :\n"; 
      str += " :\n"; 
      str += "DisplayMessageBody: "; 
      str += msgs[i].getDisplayMessageBody(); 
      str += " :\n"; 
      str += " :\n"; 
      str += "MessageBody: "; 
      str += msgs[i].getMessageBody(); 
     } 
     Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 

    } 
} 

感謝您的幫助!

+0

當前答案不顯示如何獲取接收方的號碼。我會獎賞一個可以得到電話號碼的答案,或者表明這是不可能的。 –

+0

@DaveChen SMS消息的PDU元數據不包含收件人的地址,因此無法直接從傳入文本中檢索。但是,可以通過讓設備自行發送文本來驗證設備的編號。 –

回答

0

試試這個:在設備

TelephonyManager manager =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); 
mPhoneNumber = manager.getLine1Number(); 

這僅適用於該號碼存儲在SIM卡

+0

這不是我正在尋找的正確解決方案。即使電話號碼未保存在SIM卡中,雙SIM卡手機如何識別哪個SIM卡獲得了SMS?但是,我不在尋找設備/ SIM卡來告訴我電話號碼。這可能適用於更少的SIM卡,而不是全部。 您能否告訴我是否有可能通過RAW短信知道接收方電話號碼,而不是依賴於設備/ SIM卡。 – User12111111

+0

我已經研究過這個,但我找不到任何。我猜,android API不支持接收者的號碼。我可能是錯的。 – User12111111

+0

我不知道任何可以幫助你的東西 – ramaral

1

使用內容提供商

Uri uri = Uri.parse("content://sms"); 
Cursor messageCursor = cr.query(uri, new String[] { "_id", "thread_id", "address", "date", "type", "body"}, null , null, "date" + " ASC"); 

messageCursor.moveToFirst(); 

String address = messageCursor.getString(messageCursor.getColumnIndex("address")); 
String type = messageCursor.getString(messageCursor.getColumnIndex("type")); 



.... 
+0

不是一個正確的解決方案。謝謝回覆。要明確,問題是如何從RAW短信中獲取接收者的電話號碼? – User12111111

3

TelephonyManager是不是正確的解決方案上,因爲在某些情況下,號碼不會存儲在SIM卡中,由於我的建議,您應該在首次打開應用程序時使用Shared Preference存儲用戶的電話號碼,並在此之後,號碼將用於任何需要的應用程序。

如果你想獲取發送者號碼, 你只有當你inistiaze一個包獲得消息內容

messsage[0].getOriginatingAddress(); 
-1
public class SmsReceiver extends BroadcastReceiver 
{ 
@Override 
    public void onReceive(Context context, Intent intent) 
    { 


//---get the SMS message passed in--- 
    Bundle bundle = intent.getExtras();   
    SmsMessage[] msgs = null; 
    String str = "";    
    if (bundle != null) 
    { 
     //---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length];    
     for (int i=0; i<msgs.length; i++){ 
      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);     
      str += "SMS from " + msgs[i].getOriginatingAddress();      
      // here you retrieve receiver phonenumber from msgs[i].getOriginatingAddress(); 
      str += " :"; 
      str += msgs[i].getMessageBody().toString(); 
      str += "\n";   
     } 
     //---display the new SMS message--- 
     Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 


}       
} 
} 
+0

該帖子沒有回答這個問題。 –

3

短信是通過MAP是傳遞調用廣播中的onReceive這種方法SIM和MSC/GMSC/SMSC之間的協議(一些細節here)。 SIM卡已經在這個關聯中被識別出來。此外,SMS DELIVER不包含收件人地址。見this。所以,據我所知,由於上述原因,沒有一個你想要的API的直接API。

相關問題