大侠们,我在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小时,分段接收还未完成,则终止接收,将已接收的部分删除,不给呈现用户短信。

解决方案 »

  1.   

    这样应该就划分成几个短信了吧,将一个长的短信划分成几个SmsMessage,然后你对每个SmsMessage做处理。
      

  2.   

    在Android里没有分成几条短信,还是一条,只是分段接收。
      

  3.   


    运营商拆了,但是Android手机的内部机制能判断一条长短信是否分段接收的,如果是,则应接收完(全部分段)后,再显示短信。
      

  4.   


    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;
        }
      

  5.   

    public class SMSActivity extends Activity {
    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);
    }
    }
    });
        }
    }
      

  6.   


    如果运营商主动拆分多条短信的话 msgs.length这个值就是1的,然后发几条的。你在 5楼不是给出了处理的代码了吗,还要什么呢
      

  7.   


    个人认为应该支持分段接收的,MTK和展讯这些山寨都支持长短信分段接收
      

  8.   

    这样应该就划分成几个短信了吧,将一个长的短信划分成几个SmsMessage,然后你对每个SmsMessage做处理。
      

  9.   

    5楼的方法已经是正解了,framework层里也确有相应的代码可以参考,你可以把它的贴出来,自己用。
    做临时表存储分段的短信,一但接收完成合并后,将临时分段短信删除。
    其次对于pdu协议的长短信处理了解也会很得心应手的,因为你需要识别一条长短信是如何被拆分的。