【问题标题】:Any way to get the sender phone number from a received sms on android?有什么方法可以从android上收到的短信中获取发件人的电话号码?
【发布时间】:2012-10-27 08:21:54
【问题描述】:

我成功编写了发送和接收短信程序,但我想在 onReceive 方法中检查接收方电话号码。如何从 Android 中收到的短信中获取发件人电话号码? 我写了这段代码,但它不起作用!!!请检查并帮助我。

public class SmsReceiver extends BroadcastReceiver {
    public String str = "";

    @Override
    public void onReceive(Context context, Intent intent) {
        // ---get the SMS message passed in---

        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;

        if (bundle != null) {

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

                //for get sms from special number===============================
                String msg_from = msgs[i].getOriginatingAddress();
                Log.v("msg_from >>",msg_from);     
                if(msg_from.equals("08522215"))
                {
                    //===============================
                str += "SMS 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();
            Intent act = new Intent(context, MainActivity.class);
            act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            act.putExtra("message", str);
            context.startActivity(act);
        }

        abortBroadcast();
        }
    }

manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sms"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />

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

<uses-permission android:name="android.permission.READ_SMS" />
    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <activity android:name=".SMS"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity"
                  android:label="@string/app_name"/>
       <receiver
            android:name="com.example.sms.SmsReceiver"
            class="com.example.sms.SmsReceiver" >
            <intent-filter android:priority="100" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>


    </application>


</manifest>

【问题讨论】:

    标签: android android-emulator sms android-sdk-2.1


    【解决方案1】:

    在捆绑对象本身中接收到发件人号码。

    【讨论】:

    • 您无法在捆绑中发送发件人号码...这是内部实现。
    【解决方案2】:

    在广播接收器中写入

    Bundle bundle = intent.getExtras(); 
    
            Object messages[] = (Object[]) bundle.get("pdus");
            SmsMessage smsMessage[] = new SmsMessage[messages.length];      
    
            for (int n = 0; n < messages.length; n++) 
            {
                smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
            }
            String receivedMessage = smsMessage[0].getMessageBody().toString().toUpperCase();
            String originatingAddress = smsMessage[0].getOriginatingAddress();
            originatingAddress = (originatingAddress!=null && originatingAddress.length()>3)?(originatingAddress.substring(3)):("") ;
    

    上面的Originating address其实就是发件人号码...

    编辑

    你可能用过

    android.telephony.gsm.SmsMessage
    

    已弃用。改用这个:

    android.telephony.SmsMessage
    

    【讨论】:

    • 这是一个工作代码,我在我的 3 个应用程序中使用它...无论如何我收到了您的电子邮件,检查后会回复...
    • 我在回答中进行了编辑,请检查。我还将向您发送您发送的 SmsReceiver.java 文件。我测试了它,工作正常。
    • 我测试了你的代码,但它没有工作......它适用于任何短信,打开程序并在 textview 中显示收到的短信内容!!!!!!!!!
    • 您是否在日志中收到消息????如果是,则更改您通过的方式,将其以捆绑方式传递并将其设置为 intent.putExtras(bundle);如果否,请检查您在清单中注册接收器的方式。很抱歉,但我无法理解……您在活动中收到消息了吗?你想要发件人号码吗?而且我看到您甚至没有使用原始地址(发件人号码)。通过 intent.putExtras() 传递它;您是否在日志中收到消息和发件人号码?
    【解决方案3】:

    试试下面的代码

    不要忘记在清单文件中授予短信接收权限

    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
    
    
    
    
    
    public class SmsReceiver extends BroadcastReceiver{
    
    private Intent intent;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
    
     /* ************** BIG COMMENT STARTS *******
        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras(); 
    
        SmsMessage[] msgs = null;
        SmsMessage[] phonenum =null;//
    
        String str = ""; 
        String PhoneNUMBER =""; //
    
        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();                     
                str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "\n";        
            }
    
    
            //---retrieve the SMS senders number ---
            phonenum = new SmsMessage[pdus.length];
            for (int i = 0; i < phonenum.length; i++) {
                phonenum[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
                PhoneNUMBER += phonenum[i].getOriginatingAddress();
            }
    
    
            //---display the new SMS message---
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
            Toast.makeText(context, PhoneNUMBER, Toast.LENGTH_LONG).show();
    
    
    
    
    
    
    
        } 
    

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多