【问题标题】:How to receive sms from a special phone number?如何接收来自特殊电话号码的短信?
【发布时间】:2012-10-28 08:41:45
【问题描述】:

我在android中成功编写了一个发送和接收短信。

我希望我的程序能够接收来自特殊号码(“+9856874236”)的短信。但是,如果 SMS 来自任何其他号码,它应该发送到手机的消息收件箱,而不是我的应用程序。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

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

        @Override
        public void onReceive(Context context, Intent intent) {

            Bundle bundle = intent.getExtras();
            Object messages[] = (Object[]) bundle.get("pdus");
            SmsMessage[] msgs = null;

            if (bundle != null)
            {

                Object[] pdus = (Object[]) bundle.get("pdus");
                SmsMessage smsMessage[] = new SmsMessage[messages.length];      
                String msg_from="";
                for (int n = 0; n < messages.length; n++) 
                {
                    smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
                      msg_from += msgs[n].getOriginatingAddress();
                }

                String receivedMessage = smsMessage[0].getMessageBody().toString().toUpperCase();


                if(msg_from .equals("+989124236870"))  
                {
                for (int n = 0; n < messages.length; n++) 
                {

                    smsMessage[n] = SmsMessage.createFromPdu((byte[]) pdus[n]); 
                    str += "SMS from " + msgs[n].getOriginatingAddress();
                    str += " :";
                    //str += "sms az shomare makhsus";
                    str += msgs[n].getMessageBody().toString();

                    str += "\n";

               abortBroadcast();

               }


                Intent act = new Intent(context, MainActivity.class);
                act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                act.putExtra("message", str);
                context.startActivity(act);
            }


            }

        }
    }

【问题讨论】:

标签: android android-intent android-emulator sms broadcastreceiver


【解决方案1】:

为什么要在 for 循环中附加 msg_from 参数?

msg_from += msgs[n].getOriginatingAddress();

不应该只是:

msg_from[n] = msgs[n].getOriginatingAddress();

基本上有一个 msg_from[n] 的数组,并将每条消息的每个原始地址放入其中。 然后通过遍历 msg_from 数组来检查每条消息?

您可以将原点检查移动到 for 循环中,如下所示:

for (int n = 0; n < messages.length; n++) {
           if(msg_from[n].equals("+9856874236")){  
                smsMessage[n] = SmsMessage.createFromPdu((byte[]) pdus[n]); 
                str += "SMS from " + msg_from[n];
                str += " :";
                //str += "sms az shomare makhsus";
                str += msgs[n].getMessageBody().toString();

                str += "\n";

                 abortBroadcast();
               }else{
               //Do something else 
               }
           }

【讨论】:

  • 在 if 条件下,它不应该改变吗? "if(msg_from .equals("+9856874236")) "
  • 是的,应该。我已将答案更新为: if(msg_from[n].equals("+9856874236"))
  • 好的,您确定要在要检查的手机号码前添加国家/地区代码等吗?至于印度,它将是 +91 9XXXXXXXXX
  • 电话号码,国家代码和电话之间是空格吗?例如,伊朗:+98 9xxxxxxxxx
  • 不.. 没有。 +989xxxxxxxxx 是正确的,但 +9856874236 只有 10 位数字。en.wikipedia.org/wiki/Telephone_numbers_in_Iran 提到您应该在 +98 后至少有 10 位数字,对吗? edit
【解决方案2】:

使用此示例并对其进行自定义:

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SrvSmsListener extends Service {

    private BroadcastReceiver IncomingSMSReceiver = new BroadcastReceiver() {
        private static final String SMS_RECEIVED =
                "android.provider.Telephony.SMS_RECEIVED";

        @Override
        public void onReceive(Context _context, Intent _intent) {
            if (_intent.getAction().equals(SMS_RECEIVED)) {
                Bundle bundle = _intent.getExtras();
                if (bundle != null) {
                    Object[] pdus = (Object[]) bundle.get("pdus");

                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++)
                        messages[i] = SmsMessage
                                .createFromPdu((byte[]) pdus[i]);
                    for (SmsMessage message : messages) {
                        String strPhoneNo = message.getOriginatingAddress();
                        String msg = message.getMessageBody();

                        if (msg.startsWith("my text"))
                        {
                            // this stops notifications to others
                            this.abortBroadcast();

                        }
                    }
                }
            }
        }
    };

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        IntentFilter filter = new IntentFilter(SMS_RECEIVED);
        BroadcastReceiver receiver = IncomingSMSReceiver;
        registerReceiver(receiver, filter);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        if (IncomingSMSReceiver != null)
        {
            unregisterReceiver(IncomingSMSReceiver);
        }
    }
}

【讨论】:

  • 我创建了新项目,并将您的代码放在 class.java 中,对于发送类,我放置了我的代码,对于清单,我放置了以前的代码,但是在手机中接收短信时它会强制关闭!!!
【解决方案3】:

我也遇到了这个问题。现在我使用此代码并且它可以正常工作:

        `enter code here`  
         if ( extras != null ) {
        // get array data from SMS
        Object[] smsExtra = (Object[]) extras.get( "pdus" ); // "pdus" is the key

        for ( int i = 0; i < smsExtra.length; ++i ) {
            // get sms message
            SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
            // get content and number
            String body = sms.getMessageBody();
            String address = sms.getOriginatingAddress();
            // create display message

            if( address.contains("5558")){

            messages += "SMS from " + address + " :\n";
            messages += body + "\n";

       // notify new arriving message
            Toast.makeText( context, messages, Toast.LENGTH_LONG ).show();

        this.abortBroadcast();

    }
    }

并且不要忘记在清单中使用此代码:

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

 .....
<receiver android:name=".SmsReceiver" android:exported="true" >
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />

</intent-filter>
</receiver>

此程序仅从 port="5558"(在模拟器中)接收并将其他消息存储在您的收件箱中。

是(09124236870)你自己的电话号码吗?!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多