广播接收器长二进制短信

时间:2013-07-16 10:48:50

标签: android

我在收到长二进制短信时遇到问题。客户端应该接收多部分二进制SMS。在搜索stackoverflow时,人们已经提到onReceive()只会被触发一次。从那里你可以连接多个短信。

我不确定发送二进制短信时是否相同。我收到2条短信,onReceive被解雇两次。 SMS是彼此分开的,因此无法连接。


AndroidManifest:

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

 <receiver
        android:name="com.myapp.smsnotification.SMSReceiver"
        android:enabled="true" >
        <intent-filter android:priority="100" >
            <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
            <data
                android:host="localhost"
                android:port="9515"
                android:scheme="sms" />
        </intent-filter>
 </receiver>

SMSReceiver.java

在我的onReceive()

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]);
    }
    try {
        if (messages.length > -1) {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            for (int i = 0; i < messages.length; i++) {
                SmsMessage message = messages[i];
                os.write(message.getUserData());
            }
            byte[] stream = os.toByteArray();
            // do something with stream
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

1 个答案:

答案 0 :(得分:0)

发现它不是客户端的问题,而是服务器端的问题。它们未在用户数据标头中包含指示该消息是串联SMS的部分。

如果遵循该协议,Android将能够检测到并相应地处理它们,等待所有SMS到达并且一旦包含所有收到的SMS就发射SMS广播接收器。