论坛首页 移动开发技术论坛

关于Android平台下接收指定端口SMS的解决方法

浏览 8774 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-07  
做Android开发的朋友大概都碰到过这个问题,SMS可以以DATA SMS的形式按照指定端口发出去,却在RECEIVE_SMS里接收不到。其实Android提供了一个方法,只是在文档里面没有说明,这个是android文档的通病,写得都很简单。

我这里简单介绍一下,关键是在Manifest.xml里面需要正确的配置自己的SMS Reciever。主要是把Data这个参数加上去就可以了。


举例:
--------------------------------------------------------------------
    <application android:icon="@drawable/icon" android:label="@string/app_name">   
        <receiver android:name=".SmsReceiver">
              <intent-filter>
            <action  android:name="android.intent.action.DATA_SMS_RECEIVED" />
            <data android:scheme="sms" />
            <data android:host="localhost" />
            <data android:port="8888" />

            </intent-filter>
        </receiver>

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

    </uses-permission>
-------------------------------------------------------------------------
public class SmsReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
    //---get the SMS message passed in---
    Log.e("SMS Received Begin Parse..", "SMS Received Begin Parse..\n");
    Bundle bundle = intent.getExtras();       
        SmsMessage[] msgs = null;
        String str = "";           
        if (bundle != null)
        {
       
        Log.e("SMS Received Begin Extrive..", "SMS Received Begin Extrive..\n");
            //---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]);
                Log.e("getOriginatingAddress", msgs[i].getOriginatingAddress());
                str += "SMS from " + msgs[i].getOriginatingAddress();                    
                str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "\n"; 
             
            }
            //---display the new SMS message---
            Log.e("SMS Received ", str);
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }                        
                             
    }
}
----------------------------------------------------------------------

看明白了吗,关键是这一组参数
<data android:scheme="sms" />
<data android:host="localhost" />
<data android:port="8888" />

其中的port就是你所需要接受的端口号。

其实很简单吧。不过需要注意的是,在接受Android自己发出的DATA SMS时,那个解析的方式是会报错的,我也不知道为什么。但是,接受别的平台发过来的Text SMS时是没有问题的。

我已经在G1 1.5r1上做过测试了,希望这些消息能对大家有用。

   发表时间:2009-12-15  
我在1.5,1.6的平台上,都拦截不到DATA_SMS_RECEIVED这个intent,怎么解决啊?
0 请登录后投票
   发表时间:2010-03-10  
sendDataMessage发送的消息不能被DATA_SMS_RECEIVED的receiver接到啊。
不知该如何用。
0 请登录后投票
   发表时间:2010-04-04  
那如何发出这个DATA SMS呢?

我们一般手机上能发的就是Text SMS吧?
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics