WorkingMessage获取将要发送的短信:
首先刷新收信人,然后创建SmsMessageSender类并调用sendMessage()发送短信。
private void sendSmsWorker(String msgText, String semiSepRecipients, long threadId, int simId) { String[] dests = TextUtils.split(semiSepRecipients, ";"); MessageSender sender = new SmsMessageSender(mActivity, dests, msgText, threadId); // 双卡支持 @{ sender.setSimId(simId); // @} try { sender.sendMessage(threadId);//调用SmsMessageSender的sendMessage方法发送短信 // 确认该线程没有超过最大短信数 Recycler.getSmsRecycler().deleteOldMessagesByThreadId(mActivity, threadId); } catch (Exception e) { Log.e(TAG, "Failed to send SMS message, threadId=" + threadId, e); } mStatusListener.onMessageSent(); MmsWidgetProvider.notifyDatasetChanged(mActivity); /// M: SmsReceiverService.sSmsSent = false; } }
在sendMessage()方法中实际调用queueMessage(),相当于将短信加入到发送队列。看看queueMessage()的实现。
private boolean queueMessage(long token) throws MmsException { if ((mMessageText == null) || "".equals(mMessageText.trim()) || (mNumberOfDests == 0)) { // 不允许发送空短信 throw new MmsException("Null message body or dest."); } for (int i = 0; i < mNumberOfDests; i++) { try {//将短信添加到数据库 EncapsulatedTelephony.Sms.addMessageToUri(mContext.getContentResolver(), Uri.parse("content://sms/queued"), mDests[i], mMessageText, null, mTimestamp, true /* read */, requestDeliveryReport, mThreadId, mSimId); } catch (SQLiteException e) { SqliteWrapper.checkSQLiteException(mContext, e); } } //为发送信息添加广播通知,实时反馈短信发送状态 Intent sentIt = new Intent(SmsReceiverService.ACTION_SEND_MESSAGE, null, mContext, SmsReceiver.class); mContext.sendBroadcast(sentIt); return false; }
彩信的发送相对复杂,WorkingMessage获取将要发送的彩信,刷新联系人,再生成彩信可发送的pdu,存入数据库。创建MmsMessageSender并存入彩信发送的uri。
private void sendMmsWorker(Conversation conv, Uri mmsUri, PduPersister persister, SlideshowModel slideshow, SendReq sendReq, int simId) { long threadId = 0; Cursor cursor = null; boolean newMessage = false; try { // 首先将彩信存入数据库 DraftCache.getInstance().setSavingDraft(true); mStatusListener.onPreMessageSent(); // 确认接收彩信人id. threadId = conv.ensureThreadId(); // 确认接收者地址. String[] dests = conv.getRecipients().getNumbers(true); if (dests.length == 1) { // 确认地址与数据库中匹配,如果不匹配需要更新SendReq. String newAddress = Conversation.verifySingleRecipient( mActivity, conv.getThreadId(), dests[0]); if (!newAddress.equals(dests[0])) { dests[0] = newAddress; EncodedStringValue[] encodedNumbers = EncodedStringValue .encodeStrings(dests); if (encodedNumbers != null) { sendReq.setTo(encodedNumbers); } } } newMessage = mmsUri == null; if (newMessage { // 显示彩信的正在发送状态 ContentValues values = new ContentValues(); values.put(Mms.MESSAGE_BOX, Mms.MESSAGE_BOX_OUTBOX); values.put(Mms.THREAD_ID, threadId); values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); // 双卡支持. @{ values.put(EncapsulatedTelephony.Mms.SIM_ID, simId); // / @} mmsUri = SqliteWrapper.insert(mActivity, mContentResolver, Mms.Outbox.CONTENT_URI, values); } mStatusListener.onMessageSent(); // 确认试图发送的信息. UserHappinessSignals.userAcceptedImeText(mActivity); // 确认不能有太多未发送信息. cursor = SqliteWrapper.query(mActivity, mContentResolver, Mms.Outbox.CONTENT_URI, MMS_OUTBOX_PROJECTION, null, null, null); if (cursor != null) { long maxMessageSize = MmsConfig .getMaxSizeScaleForPendingMmsAllowed() * // / M: change google default. @{ MmsConfig.getUserSetMmsSizeLimit(true); // / @} long totalPendingSize = 0; while (cursor.moveToNext()) { // / M: change google default. @{ if (PduHeaders.STATUS_UNREACHABLE != cursor .getLong(MMS_MESSAGE_STATUS_INDEX)) { totalPendingSize += cursor .getLong(MMS_MESSAGE_SIZE_INDEX); } // / @} } if (totalPendingSize >= maxMessageSize) { unDiscard(); // 允许将发送失败彩信保存为草稿. mStatusListener.onMaxPendingMessagesReached(); markMmsMessageWithError(mmsUri); return; } } } finally { if (cursor != null) { cursor.close(); } } try { if (newMessage) { // 如果还没有创建新彩信,创建一个. mmsUri = createDraftMmsMessage(persister, sendReq, slideshow, mmsUri, mActivity); } else { // 或者同步正在编辑的彩信. updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq); } // 删除彩信草稿. deleteDraftSmsMessage(threadId); } finally { DraftCache.getInstance().setSavingDraft(false); } // 将已发送彩信设置为丢弃状态. mDiscarded = true; try { MessageSender sender = new MmsMessageSender(mActivity, mmsUri, slideshow.getCurrentSlideshowSize()); // 双卡支持. @{ sender.setSimId(simId); // / @} if (!sender.sendMessage(threadId)) { // 信息通过sms协议发送,需要删除保存在彩信草稿中的副本. SqliteWrapper.delete(mActivity, mContentResolver, mmsUri, null, null); } // 确保未超过最大短信数 Recycler.getMmsRecycler().deleteOldMessagesByThreadId(mActivity, threadId); } catch (Exception e) { Log.e(TAG, "Failed to send message: " + mmsUri + ", threadId=" + threadId, e); } MmsWidgetProvider.notifyDatasetChanged(mActivity); SendTransaction.sMMSSent = false; }