在android中接收数据短信时调用广播接收器

时间:2011-05-27 07:35:23

标签: android sms broadcastreceiver

我通过另一个模拟器将数据短信发送到模拟器,我的数据短信发送到那里但我的BroadcastReceiver没有被调用。 我尝试发送/接收文本短信,并且工作正常,但我需要指定一个端口,以便只有我的应用程序可以收听短信。

这个问题已被问过两次但从未回答:如果你知道解决方案,请帮助我

Receiver.java:

public class Receiver extends BroadcastReceiver{

// Declaration of Variable for getting the message in it    


/*
*Called when The Message Received
*/
    @Override
    public void onReceive(Context context, Intent intent) 
    { 
        try{


        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String str = "";   
        byte[] data = null;

        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 frommm " + msgs[i].getOriginatingAddress();                     
                str += " :";

                data=msgs[i].getUserData();

                for(int index=0; index<data.length; ++index)
                {
                       str += Character.toString((char)data[index]);


                }




            }
            //---display the new SMS message---
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
            System.out.println("The message is "+ str);


        }    
    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }

    }

清单文件代码:(仅相关代码)

&LT;接收器android:name =“。接收器”&gt;

   <  intent-filter  > 

      <  action android:name="android.intent.action.DATA_SMS_RECEIVED" /  >

      <  data android:scheme="sms" /  >

      <  data android:host="localhost"/  >

      <  data android:port="5009"/  >

      <  action android:name="android.intent.action.BOOT_COMPLETED" /  >

            <category android:name="android.intent.category.HOME" /  >  

        <  /intent-filter  > 

    <  /receiver  >

权限:     &LT; uses-permission android:name =“android.permission.SEND_SMS”/&gt;

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

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

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

数据信息发送代码:

消息包含我要发送的字符串

byte []b=message.getBytes();
Short sObj2 = 5009;

SmsManager sms = SmsManager.getDefault();
sms.sendDataMessage(phoneNumber,null,sObj2,b,sentPI, deliveredPI)

2 个答案:

答案 0 :(得分:0)

查看http://code.google.com/p/android/issues/detail?id=1576数据短信无法在模拟器上运行。您是否在真实设备上尝试了来自http://code.google.com/p/android/issues/detail?id=1576的评论#23?

答案 1 :(得分:0)

您是否注册了接收器?您需要注册BroadcastReceiver。创建一个IntentFilter并将其传递给registerReceiver。

您是否确认本机短信应用正在模拟器中接收短信?如果是这种情况,则表示您的短信实际上已收到。我从未在模拟器之间发送过短信,只用真实的设备完成了这项工作。我遇到的问题是,在注册接收器之前,我需要将其优先级设置为高于任何其他可能响应的应用程序,包括本机SMS应用程序。你可以这样做:

filterSMSReceived.setPriority(Integer.MAX_VALUE);

这将使其在任何其他应用程序之前得到通知。