从特殊号码的android中的应用程序接收短信

时间:2013-04-04 22:53:40

标签: android sms broadcastreceiver development-environment

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

请帮助我亲爱的

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 receiver 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("+9830007546"))
                    {
                        //===============================
                    str += "SMS from " + msgs[i].getOriginatingAddress();
                    str += " :";
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";    
                    Intent act = new Intent(context, ReceiveSMS.class);
                    act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    act.putExtra("message", str);
                    context.startActivity(act);

                    this.abortBroadcast();
                    }

                }
                // ---display the new SMS message---
                // Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
            }

            }
    }

主要课程:

     private TextView showSms;
 private String   ReceivedSms;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    //this.setContentView(R.layout.receivesms);
     /*Removing system bar from screen*/
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.receivesms);
    Intent act = getIntent();       
    ReceivedSms = act.getStringExtra("message");
    showSms = (TextView) this.findViewById(R.id.textView2);
    showSms.setText(ReceivedSms);

2 个答案:

答案 0 :(得分:1)

BroadcastReceiver中优先AndroidManifest。这将使您的接收器排在第一位以处理广播。

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

BroadcastReceiver内,检查传入短信的数量是否等于您给定的数字。如果为true,则使用abortBroadcast()取消广播。

修改

有几点需要注意:

  • 进行号码匹配时,请注意电话号码格式。如果传入号码为0123456789并且您使用String.equals('+XX0123456789'),那么即使技术上正确,您的检查也会失败。请查看PhoneNumberUtils以找到解决方案。
  • 如果我没记错的话,一些设备制造商在处理短信广播时已经给出了默认的SMS应用优先级。这会弄乱你的应用程序。一定要测试一下;)

答案 1 :(得分:0)

假设您打算说您的特殊号码不应出现在收件箱中......

您无法重新路由手机接收的信息。因此,您必须在收到该消息后再在MMS数据库中查找并删除它,没有其他办法。