8

我在从传入的原始 SMS 中找出接收方电话号码时遇到问题。这是我正在尝试的代码:

有人可以告诉我如何从原始短信中检索接收者电话号码。

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

    }
}

提前感谢您的帮助!

4

5 回答 5

4

SMS 由 MAP 传递,MAP 是 SIM 与 MSC/GMSC/SMSC 之间的协议(此处有一些详细信息)。SIM 已在此关联中标识。此外,SMS DELIVER 不包括收件人地址。看到这个。因此,据我了解,可能由于上述原因,没有您想要的直接 API。

于 2014-08-24T07:08:30.690 回答
3

TelephonyManager 不是正确的解决方案,因为在某些情况下,号码没有存储在 SIM 卡中,由于我的建议,您应该在第一次打开应用程序时使用 Shared Preference 来存储用户的电话号码,之后该号码将在任何时候使用您需要在应用程序中。

如果要获取Sender号码,只需要在初始化bundle获取消息内容的时候在onReceive的广播中调用该方法即可

messsage[0].getOriginatingAddress();
于 2014-01-09T12:31:50.143 回答
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"));



 ....
于 2013-11-15T17:31:14.447 回答
0

尝试这个:

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

这仅适用于号码存储在 SIM 卡上的设备

于 2013-10-18T14:31:05.470 回答
-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();


 }                         
}
}
于 2014-08-21T10:54:02.467 回答