彩信流程(一)

Android入门-MMS-短信/彩信发送流程+代码分析 WorkingMessage获取将要发送的短信: 首先刷新收信人,然后创建SmsMessageSender类并调用sendMessage()发送短信。 private void sendSmsWorker(String msgText, String semiSepRecipients, long threadId, int simId) { String[] dests = 阅读详情

写彩信发送过程。

我想追踪的内容是:用户按下发送之后,彩信的图片阿数据阿文件阿,是怎么包装起来,最后发送出去。

按我看源码的先后顺序来写了。 写完可能最后整理下。

1. com.android.mms.data.WorkingMessage.java 类

send()函数。 注释如下:
    /**
     * Send this message over the network. Will call back with onMessageSent()
     * once it has been dispatched to the telephony stack. This WorkingMessage
     * object is no longer useful after this method has been called.
     */
这个是2.1的源码
Java代码

Java代码
  1. public   void  send() {     
  2.      if  (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {     
  3.         LogTag.debug( "send" );     
  4.     }     
  5.      
  6.      // Get ready to write to disk.     
  7.     prepareForSave( true   /* notify */ );     
  8.      
  9.      // We need the recipient list for both SMS and MMS.     
  10.      final  Conversation conv = mConversation;     
  11.     String msgTxt = mText.toString();     
  12.      
  13.      if  (requiresMms() || addressContainsEmailToMms(conv, msgTxt)) {     
  14.          // Make local copies of the bits we need for sending a message,     
  15.          // because we will be doing it off of the main thread, which will     
  16.          // immediately continue on to resetting some of this state.     
  17.          final  Uri mmsUri = mMessageUri;     
  18.          final  PduPersister persister = PduPersister     
  19.                 .getPduPersister(mContext);     
  20.      
  21.          final  SlideshowModel slideshow = mSlideshow;     
  22.          final  SendReq sendReq = makeSendReq(conv, mSubject);     
  23.      
  24.          // Make sure the text in slide 0 is no longer holding onto a     
  25.          // reference to the text     
  26.          // in the message text box.     
  27.         slideshow.prepareForSend();     
  28.      
  29.          // Do the dirty work of sending the message off of the main UI     
  30.          // thread.     
  31.          new  Thread( new  Runnable() {     
  32.              public   void  run() {     
  33.                 sendMmsWorker(conv, mmsUri, persister, slideshow, sendReq);     
  34.             }     
  35.         }).start();     
  36.     }  else  {     
  37.          // Same rules apply as above.     
  38.          final  String msgText = mText.toString();     
  39.          new  Thread( new  Runnable() {     
  40.              public   void  run() {     
  41.                 sendSmsWorker(conv, msgText);     
  42.             }     
  43.         }).start();     
  44.     }     
  45.      
  46.      // update the Recipient cache with the new to address, if it's different     
  47.     RecipientIdCache     
  48.             .updateNumbers(conv.getThreadId(), conv.getRecipients());     
  49.      
  50.      // Mark the message as discarded because it is "off the market" after     
  51.      // being sent.     
  52.     mDiscarded =  true ;     
  53. }     

粗浅的解说一下,
(1) prapareForSave. 先确保有slidshow,也就是实质内容。 确保文字已拷贝。确保标题。
(2a) 根据消息分类,如果是短信直接起一个线程,跑sendSmsWorker函数,发送短信
(2b) 如果是彩信,先跑这么个函数,确保文本信息
            // Make sure the text in slide 0 is no longer holding onto a  // reference to the text      // in the message text box.
            slideshow.prepareForSend();
TheCranberriers(卡百利)的歌真好听。
然后起一个线程,单独跑sendMmsWorker函数,后文有介绍。
彩 信比sms麻烦很多。从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,uri,PduPersister(彩信是用pdu的),slideshow包含了所有的彩信信息,sendreq包含了mime封装mms时的 headers(在我的剥壳彩信2里面有提到)。包括了 ContentType("application/vnd.wap.multipart.related" ,from,to等信息 。

(3)。 不管是短信还是彩信,起了那俩个worker函数之一就算发送信息成功了。
最后修改Recipient cache, 重置标志位,过程就结束了。


2。函数 sendMmsWorker 
Java代码

Java代码
  1. private   void  sendMmsWorker(Conversation conv, Uri mmsUri,     
  2.         PduPersister persister, SlideshowModel slideshow, SendReq sendReq) {     
  3.      // First make sure we don't have too many outstanding unsent message.     
  4.     Cursor cursor =  null ;     
  5.      try  {     
  6.         Log.d( "GN@@@" , "mContext:  " +mContext.toString());     
  7.         Log.d( "GN@@@" , "mContentResolver:  " +mContentResolver.toString());     
  8.         Log.d( "GN@@@" , "Mms.Outbox.CONTENT_URI:  " +Mms.Outbox.CONTENT_URI.toString());     
  9.              
  10.         cursor = SqliteWrapper.query(mContext, mContentResolver,     
  11.                 Mms.Outbox.CONTENT_URI, MMS_OUTBOX_PROJECTION,  null ,  null ,     
  12.                  null );     
  13.          if  (cursor !=  null ) {     
  14.              long  maxMessageSize = MmsConfig     
  15.                     .getMaxSizeScaleForPendingMmsAllowed()     
  16.                     * MmsConfig.getMaxMessageSize();     
  17.              long  totalPendingSize =  0 ;     
  18.              while  (cursor.moveToNext()) {     
  19.                 totalPendingSize += cursor.getLong(MMS_MESSAGE_SIZE_INDEX);     
  20.             }     
  21.              if  (totalPendingSize >= maxMessageSize) {     
  22.                 unDiscard();  // it wasn't successfully sent. Allow it to be     
  23.                               // saved as a draft.     
  24.                 mStatusListener.onMaxPendingMessagesReached();     
  25.                  return ;     
  26.             }     
  27.         }     
  28.     }  finally  {     
  29.          if  (cursor !=  null ) {     
  30.             cursor.close();     
  31.         }     
  32.     }     
  33.     mStatusListener.onPreMessageSent();     
  34.      
  35.      // Make sure we are still using the correct thread ID for our     
  36.      // recipient set.     
  37.      long  threadId = conv.ensureThreadId();     
  38.      
  39.      if  (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {     
  40.         LogTag.debug( "sendMmsWorker: update draft MMS message "  + mmsUri);     
  41.     }     
  42.      
  43.      if  (mmsUri ==  null ) {     
  44.          // Create a new MMS message if one hasn't been made yet.     
  45.         mmsUri = createDraftMmsMessage(persister, sendReq, slideshow);     
  46.     }  else  {     
  47.          // Otherwise, sync the MMS message in progress to disk.     
  48.         updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq);     
  49.     }     
  50.      
  51.      // Be paranoid and clean any draft SMS up.     
  52.     deleteDraftSmsMessage(threadId);     
  53.      
  54.     MessageSender sender =  new  MmsMessageSender(mContext, mmsUri, slideshow     
  55.             .getCurrentMessageSize());     
  56.      try  {     
  57.          if  (!sender.sendMessage(threadId)) {     
  58.              // The message was sent through SMS protocol, we should     
  59.              // delete the copy which was previously saved in MMS drafts.     
  60.             SqliteWrapper.delete(mContext, mContentResolver, mmsUri,  null ,     
  61.                      null );     
  62.         }     
  63.      
  64.          // Make sure this thread isn't over the limits in message count     
  65.         Recycler.getMmsRecycler().deleteOldMessagesByThreadId(mContext,     
  66.                 threadId);     
  67.     }  catch  (Exception e) {     
  68.         Log.e(TAG,  "Failed to send message: "  + mmsUri +  ", threadId="      
  69.                 + threadId, e);     
  70.     }     
  71.      
  72.     mStatusListener.onMessageSent();     
  73. }     

依旧是粗浅的解说:
a )前面挺长一段代码,检查这个对话(conversation)之前还有没有未发送的信息,uri是Mms.Outbox.CONTENT_URI。
这 里需要提到一下MessageStatusListener,这个Interface接口实现在WorkingMessage.java里,而短信类的主 题ComposeMessageActivity.java实现了这个接口,所以前者在一些状态改变的时候可以很方便的调用后者的一些函数,作相应的改 动。主要是:onProtocolChanged彩信短信互切换,onAttachmentChanged福建改变,onPreMessageSent发 消息前,onMessageSent发消息后。
b)
当然,这里调用了onPreMessageSent这个监听函数,
然后ComposeMessageActivity 就会调用resetMessage函数 ,这个函数会调整显示,focus,软键盘等等。
c)
然后检查mmsUri。如果这个uri是空的话,直接造一个新的uri继续发送。这个真是让我叫亚灭爹。因为一开始不知道
这个createDraftMmsMessage(persister, sendReq, slideshow);函数可以包含所有发送需要的信息,以为这么发出去太可怕了。
如果uri不为空。 调用的是updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq);
总之功能是,把这个将发送的mms,存disk了,也就是存draft了。为什么要发送还要存draft呢,后面另会说,因为这个是我写这个文章前想要找的东西。。。这个过程还有一些信息写道mmsUri了。所以之后mmsUri就可以代表将发送的mms的全部信息。
d)deleteDraftSmsMessage 删除草稿
e)创建一个MmsMessageSender,用这个sender来调用sendMessage函数
可以猜到的,Sms那边是SmsMessageSender,同样调用sendMessage函数
通过这里之后,短信已经真的发掉了。 这个类后面有介绍。
f)这里这个if相当搞笑,按正常流程下来,按理这里本来这里是一个彩信的发送,然后有一些数据在draft数据库,会在上面的流程中被移到send数据库。
但是搞笑的地方来了:因为忽然发现函数返回值表示刚刚发送出去的其实是一个短信sms,而已。于是要把数据库里存着的draft删掉。
我也不知道这个if里面的情况会不会发生,反正源码是这么写的,我只管不负责任直译。。。
g)调用onMessageSent这个监听函数。调用ComposeMessageActivity的onMessageSent,这个函数功能是重新显示conversation list。


3 MmsMessageSender.java类。在mms/transaction下面。实现了MessageSender接口。这个接口只有一个事儿, 就是sendMessage并返回boolean的值。弱发送的是mms,返回true。若发送的是sms,返回false。出错返回 啥?exception。

我最先想要追踪的发送流程也在这里了。贴一些代码
Java代码

Java代码
  1. public  MmsMessageSender(Context context, Uri location,  long  messageSize) {     
  2.     mContext = context;     
  3.     mMessageUri = location;     
  4.     mMessageSize = messageSize;     
  5.          
  6.      if  (mMessageUri ==  null ) {     
  7.          throw   new  IllegalArgumentException( "Null message URI." );     
  8.     }     
  9. }     
  10.   
  11.   
  12. Java代码    
  13. public   boolean  sendMessage( long  token)  throws  MmsException {     
  14.      // Load the MMS from the message uri     
  15.     PduPersister p = PduPersister.getPduPersister(mContext);     
  16.     GenericPdu pdu = p.load(mMessageUri);     
  17.      
  18.      if  (pdu.getMessageType() != PduHeaders.MESSAGE_TYPE_SEND_REQ) {     
  19.          throw   new  MmsException( "Invalid message: "  + pdu.getMessageType());     
  20.     }     
  21.      
  22.     SendReq sendReq = (SendReq) pdu;     
  23.      
  24.      // Update headers.     
  25.     updatePreferencesHeaders(sendReq);     
  26.      
  27.      // MessageClass.     
  28.     sendReq.setMessageClass(DEFAULT_MESSAGE_CLASS.getBytes());     
  29.      
  30.      // Update the 'date' field of the message before sending it.     
  31.     sendReq.setDate(System.currentTimeMillis() / 1000L);     
  32.      
  33.     sendReq.setMessageSize(mMessageSize);     
  34.      
  35.     p.updateHeaders(mMessageUri, sendReq);     
  36.      
  37.      // Move the message into MMS Outbox     
  38.     p.move(mMessageUri, Mms.Outbox.CONTENT_URI);     
  39.      
  40.      // Start MMS transaction service     
  41.     SendingProgressTokenManager     
  42.             .put(ContentUris.parseId(mMessageUri), token);     
  43.     mContext.startService( new  Intent(mContext, TransactionService. class ));     
  44.      
  45.      return   true ;     
  46. }     
  47.   

解说:
现从PduPersister那里拿数据,包括需要拼装的发送报头和需要发送的数据信息。
然后把要发送的信息相关数据从数据库的draft那里转移到send,表示已经发送。
最后起一个TransactionService服务,这个服务也是从PduPersister里找,找到需要发送的数据,并通过不同的用户网络送出去。
这块我猜一般人都没有改的需求。。

4.  
createDraftMmsMessage(persister, sendReq, slideshow); 和
updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq); 这两个函数

刨掉 try catch , createDraftMmsMessage 函数大概有这么几句:

Java代码
  1. Java代码    
  2. PduBody pb = slideshow.toPduBody();     
  3. sendReq.setBody(pb);     
  4. Uri res = persister.persist(sendReq, Mms.Draft.CONTENT_URI);     
  5. slideshow.sync(pb);     
  6.   
  7. updateDraftMmsMessage 函数大概有这么几句:    
  8. Java代码    
  9. persister.updateHeaders(uri, sendReq);     
  10. final  PduBody pb = slideshow.toPduBody();     
  11. persister.updateParts(uri, pb);     
  12. slideshow.sync(pb);     
  13.   

两个函数从本质上讲是一样的:把附件的东西以pdubody的形式存下来,另外就是更新uri。
什么叫PduBody呢? 厉害了。就是n个PduPart。什么叫PduPart呢?厉害了,就是数据库里的那个Part! 那个part是什么?
那个最厉害了。数据库里的PART_1234455这种数据,文件名代表创建时间(在mediaModel产生时就进系统了),导出来就是源文件,比如图片文件,改个jpg就可以看了。

sync函数不怎么动,无责任解说:把每个slide里面每个媒体跟真实文件位置对应上。

slideshow.toPduBody();里面,用SMILDocument mDocumentCache;
调用到SlideshowModel.java的
Java代码

Java代码
  1. //其中context= null 。 isMakingCopy= false 。 document=mDocumentCache     
  2.      private  PduBody makePduBody(Context context, SMILDocument document,     
  3.              boolean  isMakingCopy) {     
  4.         PduBody pb =  new  PduBody();     
  5.      
  6.          boolean  hasForwardLock =  false ;     
  7.          for  (SlideModel slide : mSlides) {     
  8.              for  (MediaModel media : slide) {     
  9.                  if  (isMakingCopy) {     
  10.                      if  (media.isDrmProtected() && !media.isAllowedToForward()) {     
  11.                         hasForwardLock =  true ;     
  12.                          continue ;     
  13.                     }     
  14.                 }     
  15.      
  16.                 PduPart part =  new  PduPart();     
  17.      
  18.                  if  (media.isText()) {     
  19.                     TextModel text = (TextModel) media;     
  20.                      // Don't create empty text part.     
  21.                      if  (TextUtils.isEmpty(text.getText())) {     
  22.                          continue ;     
  23.                     }     
  24.                      // Set Charset if it's a text media.     
  25.                     part.setCharset(text.getCharset());     
  26.                 }     
  27.      
  28.                  // Set Content-Type.     
  29.                 part.setContentType(media.getContentType().getBytes());     
  30.      
  31.                 String src = media.getSrc();     
  32.                 String location;     
  33.                  boolean  startWithContentId = src.startsWith( "cid:" );     
  34.                  if  (startWithContentId) {     
  35.                     location = src.substring( "cid:" .length());     
  36.                 }  else  {     
  37.                     location = src;     
  38.                 }     
  39.      
  40.                  // Set Content-Location.     
  41.                 part.setContentLocation(location.getBytes());     
  42.      
  43.                  // Set Content-Id.     
  44.                  if  (startWithContentId) {     
  45.                      // Keep the original Content-Id.     
  46.                     part.setContentId(location.getBytes());     
  47.                 }  else  {     
  48.                      int  index = location.lastIndexOf( "." );     
  49.                     String contentId = (index == - 1 ) ? location : location     
  50.                             .substring( 0 , index);     
  51.                     part.setContentId(contentId.getBytes());     
  52.                 }     
  53.      
  54.                  if  (media.isDrmProtected()) {     
  55.                     DrmWrapper wrapper = media.getDrmObject();     
  56.                     part.setDataUri(wrapper.getOriginalUri());     
  57.                     part.setData(wrapper.getOriginalData());     
  58.                 }  else   if  (media.isText()) {     
  59.                     part.setData(((TextModel) media).getText().getBytes());     
  60.                 }  else   if  (media.isImage() || media.isVideo()     
  61.                         || media.isAudio()) {     
  62.                     part.setDataUri(media.getUri());     
  63.                 }  else  {     
  64.                     Log.w(TAG,  "Unsupport media: "  + media);     
  65.                 }     
  66.      
  67.                 pb.addPart(part);     
  68.             }     
  69.         }     
  70.      
  71.          if  (hasForwardLock && isMakingCopy && context !=  null ) {     
  72.             Toast.makeText(context,     
  73.                     context.getString(R.string.cannot_forward_drm_obj),     
  74.                     Toast.LENGTH_LONG).show();     
  75.             document = SmilHelper.getDocument(pb);     
  76.         }     
  77.      
  78.          // Create and insert SMIL part(as the first part) into the PduBody.     
  79.         ByteArrayOutputStream out =  new  ByteArrayOutputStream();     
  80.         SmilXmlSerializer.serialize(document, out);     
  81.         PduPart smilPart =  new  PduPart();     
  82.         smilPart.setContentId( "smil" .getBytes());     
  83.         smilPart.setContentLocation( "smil.xml" .getBytes());     
  84.         smilPart.setContentType(ContentType.APP_SMIL.getBytes());     
  85.         smilPart.setData(out.toByteArray());     
  86.         pb.addPart( 0 , smilPart);     
  87.      
  88.          return  pb;     
  89.     }     

好了,齐活儿了

顺序有点乱。抱歉。。。

Android短彩信收发流程(Framework) 立即下载

相关推荐

彩信业务的流程与介绍

彩信业务的了解程度与能否正确认识菜系投诉有着密切的关系,所以此文档可以帮助你了解彩信的相关理论知识,让你能更好的了解彩信的发送和接收,以及彩信的相关流程与应用。

Android Mms:PDU介绍(协议数据单元)

MMS PDU(Protocol Data Unit,协议数据单元)由MMS头和MMS消息体组成,MMS头由多个域名和域值组成,由客户端指定,MMS头里面的一些域可以被MMS Proxy-Replay修改或补充,MMS Proxy-Replay使用这些头域信息生成MM通知以及构造接收MMS PDU中的相关头域,连同消息实体一同送往接收方。消息体跟在MMS头之后,大多数MMS PD...

达帮主 3560

Android Mms之:PDU的使用详解

Android当中的Mms对MMS(Multimedia Messaging Service)的操作关乎MMS协议部分都是通过Frameworks中提供的API来完成的:com.google.android.mms这个包在SDK中是不开放的,只能供内部程序使用,它封装了所有MMS所需要的API。这个包就是Android中对MMS协议的实现,包括一些数据结构:GenericPdu,MultimediaMessagePdu,SendReq,SendConf,NotificationInd,RetrieveConf,PduHeaders,PduBody,PduPart等。也包括操作这些数据的类:Pd

彩信发送流程

 发送彩信基本流程: Log分析: study_message: sendMessage study_message: WorkingMessage_send:recipientsInUI=18862631722,subId=1 study_message: WorkingMessage_sendMmsWorker,mmsUri:content://mms/drafts/11 stu...

且听真言 3151

Linux基础——“C语言高级编程” C语言中的细节你真的知道吗?

文章目录GCC简介 GCC简介 gcc 所支持后缀名解释 .c c原始程序 .C / .cc /.cxx C++原始程

weixin_44278698的博客 2511

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

Android短彩信收发流程(Framework)

短信部分:短信的发送,Framework部分从SmsManager的sendTextMessage(普通短信,无分段)与sendMultipartTextMessage(长短信,已分段)开始,一直到RIL。主要涉及到的类有。SmsManager、Isms、IccSmsInterfaceManager、SMSDispatcher、ImsSMSDispatcher、GsmSMSDispatcher...

haliluya4的专栏 450

LLM之RAG实战(五十四)| 复杂文档处理RAG框架:Ragflow

RAGFlow 是一种结合了检索增强(Retrieval-Augmented Generation,RAG)与流程控制(Flow)的人工智能技术架构。它通过检索外部知识库中的信息,结合自然语言生成技术,为用户提供更准确、更丰富的回答。同时,它还引入了流程控制机制,能够根据任务需求动态调整信息检索和生成的流程,从而更好地完成复杂的任务。RAGFlow 的核心优势在于将检索和生成相结合,打破了传统生成模型仅依赖内部参数进行文本生成的局限。

wshzd的博客 1067

彩信发送

彩信发送。<br />转自:http://gnibre.javaeye.com/blog/645655<br /> <br />我想追踪的内容是:用户按下发送之后,彩信的图片阿数据阿文件阿,是怎么包装起来,最后发送出去。 <br /><br /> 按我看源码的先后顺序来写了。 写完可能最后整理下。 <br /><br /> 1. com.android.mms.data.WorkingMessage.java 类 <br /><br /> send()函数。 注释如下: <br />    

winnerfm的专栏 1150

MiniMAX H3官方SKILL三段式提示词模板与本地部署全解

视频生成模型的效果高度依赖于提示词的结构与质量,而提示词工程正是连接自然语言与视觉表达的关键桥梁。在文本模型之外,视频模型对场景、角色、镜头动作的信息层次更为敏感,普通自由描述往往导致画面漂移、风格不稳定。MiniMAX H3 作为社区热议的视频生成模型,通过一套官方 SKILL 三段式提示词模板,将环境、主体、镜头动作分类组织,免API、免推理即可稳定产出风格统一的素材。这一设计不仅降低了提示词编写门槛,也提升了多轮生成的复用性,适合短视频生产、影视概念设计及自动化视频流水线等场景。本文围绕该模板的结构与

weixin_33309048的博客 1182

游戏客户端开发工程师部分笔试题解析

你可以选择任意连续K个宝石合并成一个新的宝石,新宝石保持在原队列的位置且它的能量值是这K个宝石能量值之和。给定一个幸运值N=0、一堆包含能量值的宝石,你的任务是找到将所有宝石合并成一个宝石的最大幸运值。2.在一个二维网格中,有一个起点S、一个终点E和一个必须经过的中间点M。C++ 的多态性正是通过基类指针或引用调用派生类覆盖的虚函数实现的,这是运行时多态的核心机制。光线追踪带来的抗锯齿效果是其渲染方法的自然结果,而不是一个独立的算法。宝石具体能量值:[10, 7, 2, 6, 5, 11, 8];

博客 3030

短信的发送流程

在android中,google为开发者提供了一个SmsManager用来管理发送和接收短信的类,类似于WifiManager,先看下SmsManager的常用APISmsManager常用APImethod public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);一条短信只可容纳70个中文,所以当短信

mockingbirds的专栏 6078

B站自动答题协议分析

使用Python写了一个自动答题机器人!基于接口协议实现且包含点选验证码识别

吴秋霖的博客 2654

android 发彩信流程,发送短信流程一

1.sendpackages\apps\Mms\src\com\android\mms\data\WorkingMessage.javapublic void send(final String recipientsInUI) {long origThreadId = mConversation.getThreadId();removeSubjectIfEmpty(true /* notify *...

weixin_30344519的博客 664

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

Android短彩信源码解析-短信发送流程(一)

有人问我怎么了解原生应用的流程,可能每个人有最适合每个人的方法,现将我的方法说一下,供大家参考: 1、通过DEBUG,DEBUG可以了解每一步代码做了什么,而且可以看到堆栈执行过程。 2、通过打Log的方式。在自己不了解的流程模块打大量的log信息,根据log信息,摸清“模块”的底细。 上述两种方式都需要足够的耐心,但是逐渐接触谜团的真相的过程,确实很享受。好奇心是程序猿,攻城狮的朋友。 现将短信发送的流程整理一下,不当之处请大家斧正。

hailushijie的专栏 8168

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

短信发送流程一:系统彩信(MMS)发送流程(2.2)

1.      点击发送按钮Src/com/android/mms/ui/ComposeMessageActivity.java public void onClick(View v) {         if ((v == mSendButton) && isPreparedForSending()) {             confirmSendMessageIfNeed

flying_vip_521的专栏 3930

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 6.0MMS彩信业务非主数据卡切换

安卓6.0中使用非主数据卡进行彩信发送时,数据卡的切换过程。如下: 主要包括从framework开始的彩信发送过程、数据卡从卡一切到卡二过程以及最后彩信业务释放过程。

what_a_fuck的博客 869

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Symbian CreateAndSendMessageL发送彩信

Symbian CreateAndSendMessageL发送彩信1 用程序调用彩信的编辑框进行彩信发生,通常用在好友推荐的场合. 程序把彩编辑框调起来.插入相应的内容并把焦点设置到输入号码处. 让用户设置号码即可以发送. 让我们看看如何实现 void CSendMMSTestAppUi::CreateAndSendMessageL(const TDesC& desContent) { // create empty message CMessageData* message =

taoshuai567的专栏 781

集团企业用户收不到彩信手机报是怎么回事?

彩信手机报可广泛应用于政府机构、企事业单位的多个场景中。例如政府机关、事业单位进行国家政策、民生公告、 政府规划 、廉政教育、 政务公开、反诈宣传、扶贫宣传、 疫情防控宣传等。集团、企业内部发布企业内刊、员工培训、内部通知、文化建设等。但是很多企业在发送中经常遇到部分用户收不到彩信手机报的情况。 具体原因分析: 手机不支持彩信功能或彩信参数设置不正确; 手机未开通流量上网功能; 手机关机或不在服务区的时间已超出手机报的发送时限; GPRS网络不稳定或信号不佳,导致您接收彩信延迟或信息丢失; 手机是否

m0_61627247的博客 419

Android Mms专题之:信息发送流程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34387284的博客 120

彩信发送流程 --- 之一

6,彩信发送流程 发送彩信可以调用MmsManager.java的sendMultimediaMessage方法就可以发送彩信。 CTS 测试彩信部分代码如下, final SmsManager smsManager = SmsManager.getDefault(); ••• smsManager.sendMultimediaMessage(context, contentUri, n

Jack的博客 4346

彩信发送流程 --- 之二

6.2 发送流程分析 MmsService的mStub变量的sendMessage方法调用流程图如下, sendMessage方法主要逻辑如下, 1,将要发送的内容等信息封装为SendRequest对象, final SendRequest request = new SendRequest(MmsService.this, subId, contentUri, loc

Jack的博客 1956

SIM900发送MMS彩信的流程

这是一篇介绍SIM900发送MMS彩信的详细流程,具体请参考SIMCom公司标准文档“SIM900_MMS_AT Command Manual_V1.01.pdf”。

weixin_42550185的博客 804
上一篇: 相对布局简解
下一篇: 只是notify() 而已
Android_wy
博客等级 码龄16年 37粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值