WorkingMessage获取将要发送的短信:

首先刷新收信人,然后创建SmsMessageSender类并调用sendMessage()发送短信。

[java] view plaincopy
  1. private void sendSmsWorker(String msgText, String semiSepRecipients, long threadId, int simId) {
  2. String[] dests = TextUtils.split(semiSepRecipients, ";");
  3. MessageSender sender = new SmsMessageSender(mActivity, dests, msgText, threadId);
  4. // 双卡支持 @{
  5. sender.setSimId(simId);
  6. // @}
  7. try {
  8. sender.sendMessage(threadId);//调用SmsMessageSender的sendMessage方法发送短信
  9. // 确认该线程没有超过最大短信数
  10. Recycler.getSmsRecycler().deleteOldMessagesByThreadId(mActivity, threadId);
  11. } catch (Exception e) {
  12. Log.e(TAG, "Failed to send SMS message, threadId=" + threadId, e);
  13. }
  14. mStatusListener.onMessageSent();
  15. MmsWidgetProvider.notifyDatasetChanged(mActivity);
  16. /// M:
  17. SmsReceiverService.sSmsSent = false;
  18. }
  19. }

在sendMessage()方法中实际调用queueMessage(),相当于将短信加入到发送队列。看看queueMessage()的实现。

[java] view plaincopy
  1. private boolean queueMessage(long token) throws MmsException {
  2. if ((mMessageText == null) || "".equals(mMessageText.trim()) || (mNumberOfDests == 0)) {
  3. // 不允许发送空短信
  4. throw new MmsException("Null message body or dest.");
  5. }
  6. for (int i = 0; i < mNumberOfDests; i++) {
  7. try {//将短信添加到数据库
  8. EncapsulatedTelephony.Sms.addMessageToUri(mContext.getContentResolver(),
  9. Uri.parse("content://sms/queued"), mDests[i],
  10. mMessageText, null, mTimestamp,
  11. true /* read */,
  12. requestDeliveryReport,
  13. mThreadId,
  14. mSimId);
  15. } catch (SQLiteException e) {
  16. SqliteWrapper.checkSQLiteException(mContext, e);
  17. }
  18. }
  19. //为发送信息添加广播通知,实时反馈短信发送状态
  20. Intent sentIt = new Intent(SmsReceiverService.ACTION_SEND_MESSAGE, null, mContext,
  21. SmsReceiver.class);
  22. mContext.sendBroadcast(sentIt);
  23. return false;
  24. }

彩信的发送相对复杂,WorkingMessage获取将要发送的彩信,刷新联系人,再生成彩信可发送的pdu,存入数据库。创建MmsMessageSender并存入彩信发送的uri。

[java] view plaincopy
  1. private void sendMmsWorker(Conversation conv, Uri mmsUri,
  2. PduPersister persister, SlideshowModel slideshow, SendReq sendReq,
  3. int simId) {
  4. long threadId = 0;
  5. Cursor cursor = null;
  6. boolean newMessage = false;
  7. try {
  8. // 首先将彩信存入数据库
  9. DraftCache.getInstance().setSavingDraft(true);
  10. mStatusListener.onPreMessageSent();
  11. // 确认接收彩信人id.
  12. threadId = conv.ensureThreadId();
  13. // 确认接收者地址.
  14. String[] dests = conv.getRecipients().getNumbers(true);
  15. if (dests.length == 1) {
  16. // 确认地址与数据库中匹配,如果不匹配需要更新SendReq.
  17. String newAddress = Conversation.verifySingleRecipient(
  18. mActivity, conv.getThreadId(), dests[0]);
  19. if (!newAddress.equals(dests[0])) {
  20. dests[0] = newAddress;
  21. EncodedStringValue[] encodedNumbers = EncodedStringValue
  22. .encodeStrings(dests);
  23. if (encodedNumbers != null) {
  24. sendReq.setTo(encodedNumbers);
  25. }
  26. }
  27. }
  28. newMessage = mmsUri == null;
  29. if (newMessage {
  30. // 显示彩信的正在发送状态
  31. ContentValues values = new ContentValues();
  32. values.put(Mms.MESSAGE_BOX, Mms.MESSAGE_BOX_OUTBOX);
  33. values.put(Mms.THREAD_ID, threadId);
  34. values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ);
  35. // 双卡支持. @{
  36. values.put(EncapsulatedTelephony.Mms.SIM_ID, simId);
  37. // / @}
  38. mmsUri = SqliteWrapper.insert(mActivity, mContentResolver,
  39. Mms.Outbox.CONTENT_URI, values);
  40. }
  41. mStatusListener.onMessageSent();
  42. // 确认试图发送的信息.
  43. UserHappinessSignals.userAcceptedImeText(mActivity);
  44. // 确认不能有太多未发送信息.
  45. cursor = SqliteWrapper.query(mActivity, mContentResolver,
  46. Mms.Outbox.CONTENT_URI, MMS_OUTBOX_PROJECTION, null, null,
  47. null);
  48. if (cursor != null) {
  49. long maxMessageSize = MmsConfig
  50. .getMaxSizeScaleForPendingMmsAllowed() *
  51. // / M: change google default. @{
  52. MmsConfig.getUserSetMmsSizeLimit(true);
  53. // / @}
  54. long totalPendingSize = 0;
  55. while (cursor.moveToNext()) {
  56. // / M: change google default. @{
  57. if (PduHeaders.STATUS_UNREACHABLE != cursor
  58. .getLong(MMS_MESSAGE_STATUS_INDEX)) {
  59. totalPendingSize += cursor
  60. .getLong(MMS_MESSAGE_SIZE_INDEX);
  61. }
  62. // / @}
  63. }
  64. if (totalPendingSize >= maxMessageSize) {
  65. unDiscard(); // 允许将发送失败彩信保存为草稿.
  66. mStatusListener.onMaxPendingMessagesReached();
  67. markMmsMessageWithError(mmsUri);
  68. return;
  69. }
  70. }
  71. } finally {
  72. if (cursor != null) {
  73. cursor.close();
  74. }
  75. }
  76. try {
  77. if (newMessage) {
  78. // 如果还没有创建新彩信,创建一个.
  79. mmsUri = createDraftMmsMessage(persister, sendReq, slideshow,
  80. mmsUri, mActivity);
  81. } else {
  82. // 或者同步正在编辑的彩信.
  83. updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq);
  84. }
  85. // 删除彩信草稿.
  86. deleteDraftSmsMessage(threadId);
  87. } finally {
  88. DraftCache.getInstance().setSavingDraft(false);
  89. }
  90. // 将已发送彩信设置为丢弃状态.
  91. mDiscarded = true;
  92. try {
  93. MessageSender sender = new MmsMessageSender(mActivity, mmsUri,
  94. slideshow.getCurrentSlideshowSize());
  95. // 双卡支持. @{
  96. sender.setSimId(simId);
  97. // / @}
  98. if (!sender.sendMessage(threadId)) {
  99. // 信息通过sms协议发送,需要删除保存在彩信草稿中的副本.
  100. SqliteWrapper.delete(mActivity, mContentResolver, mmsUri, null,
  101. null);
  102. }
  103. // 确保未超过最大短信数
  104. Recycler.getMmsRecycler().deleteOldMessagesByThreadId(mActivity,
  105. threadId);
  106. } catch (Exception e) {
  107. Log.e(TAG, "Failed to send message: " + mmsUri + ", threadId="
  108. + threadId, e);
  109. }
  110. MmsWidgetProvider.notifyDatasetChanged(mActivity);
  111. SendTransaction.sMMSSent = false;
  112. }

android发送彩信相关推荐

  1. Android 发送彩信

    一.调用系统UI发送 Intent sendIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mms://")); sendIn ...

  2. android 发送彩信监听,在Android中发送短信和彩信,监听短信并显示

    发送短信: String body="this is sms demo"; Intent mmsintent = new Intent(Intent.ACTION_SENDTO, ...

  3. android 发送彩信监听,第74章、再识Intent-调用发送彩信程序(从零开始学Android)...

    一.设计界面 1.布局文件 打开res/layout/activity_main.xml文件. 输入以下代码: xmlns:android="http://schemas.android.c ...

  4. Android发送彩信(带图片附件)

    public static void sendSMS(Context c) {PaintController.save2Cache(c);// 先把图片保存,再调用系统自带的SMSString img ...

  5. Android开发笔记(一百七十六)借助FileProvider发送彩信

    通过系统相册固然可以获得照片的路径对象,却无法知晓更多的详细信息,例如图片名称.文件大小.文件路径等等都不知道,也就无法进行个性化的定制开发.为了把更多的文件信息开放出来,Android设计了专门的媒 ...

  6. Android短信开发 发送彩信 ‘ 高通源码 ‘ (彩信发送过程1)

    Android彩信发送有下面几个类: 一个一个类看  : 1 . ComposeMessageActivity.java   详情页面 2 . WoringMessage.java           ...

  7. android 实现发送彩信方法 (MMS)

    最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...

  8. android 实现发送彩信,android 实现发送彩信方法 (MMS)

    最近有个突然有个想法,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager sm ...

  9. android 实现发送彩信方法 (mms),非调用,android 实现发送彩信方法 (MMS),非调用系统界面...

    最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...

最新文章

  1. VMDNS服务器未响应,vmware克隆虚拟机后进行网络配置
  2. java 方法继承方法_Java继承和方法重写
  3. git / 如何将其他分支的某些 commit 合并到当前分支中?
  4. RxJava学习-使用篇
  5. 在SAP UI5应用里使用jQuery.ajax读取数据并显示在页面上
  6. HTML常见标签总结
  7. dump分析工具_Java应用CPU过高,如何排查?参考解决思路和常用工具总结
  8. Python小白的数学建模课-22.插值方法
  9. c语言答案知码,C语言笔试习题集答案和解析.doc
  10. 基于.NET Compact Framework的应用程序和库汇总
  11. 抓取知网摘要、搜狗微信文章、搜狗新闻的爬虫
  12. echarts饼图南丁格尔玫瑰图属性设置
  13. 改造create-react-app 引入dva和antd
  14. 分享 outlook 附件被禁止访问的解决方法
  15. 百度云有关Token
  16. 天梵古法健康知识普及:足阳明胃经经穴
  17. 华为怎么改输入法皮肤_怎么设置华为手机输入法皮肤
  18. 京鱼座智能屏i8 Pro“强势出道”,重新思考智能音箱的产业坐标系
  19. 我居然被TransmittableThreadLocal框架作者评论了
  20. css opacity影响子元素解决办法

热门文章

  1. C++中的log10函数
  2. PHP实现调查报告的代码,2015 年 JavaScript 开发者调查报告:PHP是最好的编程语言!...
  3. python程序设计基础考试重点_python语言程序设计基础 复习整理 第1-3章
  4. 关于竞争上岗机制的操作流程
  5. 禅道----基于敏捷思想的项目管理工具
  6. 怎样批量处理图片大小
  7. java 获取图片的媒体属性,以大疆无人机照片为例
  8. SAP信贷最早未清项控制不执行问题
  9. Berkeley DB(四) -- DB Environment
  10. 欧几里德算法,扩展算法