大侠们,我在framework中找不到分段接收长短信的代码。只看到了下面的:
在Telephony.java文件中有如下函数:/**
* Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a
* {@link #DATA_SMS_RECEIVED_ACTION} intent.
*
* @param intent the intent to read from
* @return an array of SmsMessages for the PDUs
*/
public static final SmsMessage[] getMessagesFromIntent(
Intent intent) {
Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
byte[][] pduObjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i++) {
pduObjs[i] = (byte[]) messages[i];
}
byte[][] pdus = new byte[pduObjs.length][];
int pduCount = pdus.length;
SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i < pduCount; i++) {
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}
return msgs;
}
请问到底是怎么分段接收的哦。
我要知道这个的目的是:我想在分段接收前,设置一个定时器,时长是48小时。如果分段接收完毕,则将短信呈现给用户,若超过48小时,分段接收还未完成,则终止接收,将已接收的部分删除,不给呈现用户短信。
在Telephony.java文件中有如下函数:/**
* Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a
* {@link #DATA_SMS_RECEIVED_ACTION} intent.
*
* @param intent the intent to read from
* @return an array of SmsMessages for the PDUs
*/
public static final SmsMessage[] getMessagesFromIntent(
Intent intent) {
Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
byte[][] pduObjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i++) {
pduObjs[i] = (byte[]) messages[i];
}
byte[][] pdus = new byte[pduObjs.length][];
int pduCount = pdus.length;
SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i < pduCount; i++) {
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}
return msgs;
}
请问到底是怎么分段接收的哦。
我要知道这个的目的是:我想在分段接收前,设置一个定时器,时长是48小时。如果分段接收完毕,则将短信呈现给用户,若超过48小时,分段接收还未完成,则终止接收,将已接收的部分删除,不给呈现用户短信。
解决方案 »
- 帮我看一下 数据库修改语句吧,数据库很不好,怎么看都不知道为什么执行不了。。。谢谢了。。。
- 两个Activity没法跳转,求助
- android的"系统设置"用的什么组件
- android怎样实现如360手机安全卫士桌面上的图标
- Unable to start activity ComponentInfo{mars.activity04/mars.activity04.SecondAct
- 关于读取手机固件版本号的问题
- 缩略图如何实现
- 来电保存游戏状态
- Intent.DATA_CONNECTION_CHANGED_ACTION 这么用是否有问题啊?请高手指点下。
- 口袋通怎么使用?
- 如何在android程序中读txt文件中的内容
- android的R文件中的各种public static final class *分别代表了什么
运营商拆了,但是Android手机的内部机制能判断一条长短信是否分段接收的,如果是,则应接收完(全部分段)后,再显示短信。
private Uri storeMessage(Context context, SmsMessage[] msgs, int error) {
SmsMessage sms = msgs[0]; // Store the message in the content provider.
ContentValues values = extractContentValues(sms);
values.put(Sms.ERROR_CODE, error);
int pduCount = msgs.length; if (pduCount == 1) {//一条
// There is only one part, so grab the body directly.
values.put(Inbox.BODY, sms.getDisplayMessageBody());
} else {//多条
// Build up the body from the parts.
StringBuilder body = new StringBuilder();
for (int i = 0; i < pduCount; i++) {
sms = msgs[i];
body.append(sms.getDisplayMessageBody());
}
values.put(Inbox.BODY, body.toString());
} // Make sure we've got a thread id so after the insert we'll be able to delete
// excess messages.
Long threadId = values.getAsLong(Sms.THREAD_ID);
String address = values.getAsString(Sms.ADDRESS);
Contact cacheContact = Contact.get(address,true);
if (cacheContact != null) {
address = cacheContact.getNumber();
} if (((threadId == null) || (threadId == 0)) && (address != null)) {
threadId = Threads.getOrCreateThreadId(context, address);
values.put(Sms.THREAD_ID, threadId);
} ContentResolver resolver = context.getContentResolver(); Uri insertedUri = SqliteWrapper.insert(context, resolver, Inbox.CONTENT_URI, values); // Now make sure we're not over the limit in stored messages
Recycler.getSmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(), threadId); return insertedUri;
}
private EditText number_EditText;
private EditText content_EditText;
private Button send_Button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
number_EditText = (EditText)this.findViewById(R.id.number_EditText);
content_EditText = (EditText)this.findViewById(R.id.content_EditText);
send_Button = (Button)this.findViewById(R.id.send_Button);
send_Button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
String number = number_EditText.getText().toString();
String content = content_EditText.getText().toString();
SmsManager smsManager = SmsManager.getDefault();
if (content.length() > 70){
List<String> contents = smsManager.divideMessage(content);
for(String sms:contents){
smsManager.sendTextMessage(number, null, sms, null, null);
}
}else{
smsManager.sendTextMessage(number, null, content, null, null);
}
}
});
}
}
如果运营商主动拆分多条短信的话 msgs.length这个值就是1的,然后发几条的。你在 5楼不是给出了处理的代码了吗,还要什么呢
个人认为应该支持分段接收的,MTK和展讯这些山寨都支持长短信分段接收
做临时表存储分段的短信,一但接收完成合并后,将临时分段短信删除。
其次对于pdu协议的长短信处理了解也会很得心应手的,因为你需要识别一条长短信是如何被拆分的。