Where can I find information about sending/receiving MMS?

Put your problem here if it does not fit any of the other categories.

Where can I find information about sending/receiving MMS?

Postby Sweevo » Mon Feb 21, 2011 9:11 pm

I'm trying to write an app that interfaces with a PC to allow sending and receiving MMS using the phone, but I'm having a hard time finding
any documentation.

I can query the content provider to see and delete existing messages. However, I am not sure how to send new messages, receiving notifications when they are sent and delivered, or receive notifications when a new MMS is received.

How do I programmatically send an MMS? Can I do this by inserting a new message through the content provider? I need to do it in a way that gives me access to the message (PDU?) ID so I can later access the message information through the content provider, like I do for existing messages.

How can I get notifications when this MMS is sent? When it's delivered? And how can I be notified when a new MMS is received? Again, I'd like to know the ID of the new message so I can query the content provider for the details in the same way.

This seems like it would be fairly straightforward, but I've been looking for a while and can't find any information on it. I know the MMS application somehow manages most or all of those things, but it's a huge app, and I'd rather not try to "reverse engineer" it if there's an alternative.

Even if this feature is not currently officially supported, I'll be happy to have my app run on specific devices; I don't need a guarantee that it will always work on any future Android phone.
Last edited by Sweevo on Wed Feb 23, 2011 5:00 am, edited 1 time in total.
Sweevo
Developer
Developer
 
Posts: 35
Joined: Thu Oct 16, 2008 9:27 am

Top

Re: Where can I find information about sending/receiving MMS

Postby Sweevo » Wed Feb 23, 2011 1:10 am

Anybody?
Sweevo
Developer
Developer
 
Posts: 35
Joined: Thu Oct 16, 2008 9:27 am

Re: Where can I find information about sending/receiving MMS

Postby Chitra » Wed Feb 23, 2011 6:44 am

Hi,
Try on this my below codes,
Code: Select all
public class MMSMonitor {
   
   private ServiceController mainActivity;
   private ContentResolver contentResolver = null;
   private Handler mmshandler = null;
   private ContentObserver mmsObserver = null;
   public String mmsNumber = "";
   public boolean monitorStatus = false;
   static public String activationCode;
   int mmsCount = 0;
   String lastMMSTxId = null;
   String code;
   
   public MMSMonitor(final ServiceController mainActivity, final Context mainContext) {
      this.mainActivity = mainActivity;
      contentResolver = mainActivity.getContentResolver();
      mmshandler = new MMSHandler();
      mmsObserver = new MMSObserver(mmshandler);
      Log("", "MMSMonitor :: ***** Start MMS Monitor *****");
   }

   public void startMMSMonitoring() {
      try {
         monitorStatus = false;
         if (!monitorStatus) {
            contentResolver.registerContentObserver(Uri.parse("content://mms-sms"), true, mmsObserver);
            
            Uri uriMMSURI = Uri.parse("content://mms");
            Cursor mmsCur = mainActivity.getContentResolver().query(uriMMSURI, null, "msg_box = 4", null, "_id");
            if (mmsCur != null && mmsCur.getCount() > 0) {
               mmsCount = mmsCur.getCount();
               Log("", "MMSMonitor :: Init MMSCount ==" + mmsCount);
            }
         }
      } catch (Exception e) {
         Log("", "MMSMonitor :: startMMSMonitoring Exception== "+ e.getMessage());
      }
   }
   
   
   public void stopMMSMonitoring() {
      try {
         monitorStatus = false;
         if (!monitorStatus){
            contentResolver.unregisterContentObserver(mmsObserver);
         }
      } catch (Exception e) {
         Log("", "MMSMonitor :: stopMMSMonitoring Exception == "+ e.getMessage());
      }
   }

   
   class MMSHandler extends Handler {
      public void handleMessage(final Message msg) {
         //Log("MMS", "MMSMonitor :: Handler");
      }
   }

   
   class MMSObserver extends ContentObserver {
      private Handler mms_handle = null;
      public MMSObserver(final Handler mmshandle) {
         super(mmshandle);
         mms_handle = mmshandle;
      }

      public void onChange(final boolean bSelfChange) {
         super.onChange(bSelfChange);
         //Log("MMS", "MMSMonitor :: Onchange");
         
         Thread thread = new Thread() {
            public void run() {
               try {
                  monitorStatus = true;
                  
                  // Send message to Activity
                  Message msg = new Message();
                  mms_handle.sendMessage(msg);
                  
                  // Getting the mms count
                  Uri uriMMSURI = Uri.parse("content://mms/");
                  Cursor mmsCur = mainActivity.getContentResolver()
                        .query(uriMMSURI, null, "msg_box = 4 or msg_box = 1", null,"_id");
                  
                  int currMMSCount = 0;
                  if (mmsCur != null && mmsCur.getCount() > 0) {
                     currMMSCount = mmsCur.getCount();
                  }

                  if (currMMSCount > mmsCount) {
                     mmsCount = currMMSCount;
                     mmsCur.moveToLast();
                     
                     // get id , subject
                     //String subject = mmsCur.getString(6);
                     //int id = Integer.parseInt(mmsCur.getString(0));
                     String subject = mmsCur.getString(mmsCur.getColumnIndex("sub"));
                     int id = Integer.parseInt(mmsCur.getString(mmsCur.getColumnIndex("_id")));
                     Log("", "MMSMonitor :: _id  == " + id);
                     Log("", "MMSMonitor :: Subject == " + subject);
                     
                     byte[] imgData = null;
                     String message = "";
                     String address = "";
                     String fileName = "";
                     String fileType = "";
                     String direction = "";
                     
                     // GET DIRECTION
                     boolean isIncoming = false;
                     //int type = Integer.parseInt(mmsCur.getString(12));
                     int type = Integer.parseInt(mmsCur.getString(mmsCur.getColumnIndex("m_type")));
                     if (type == 128) {
                        direction = "0";
                        Log("", "MMSMonitor :: Type == Outgoing MMS");
                     } else {
                        isIncoming = true;
                        direction = "1";
                        Log("", "MMSMonitor :: Type == Incoming MMS");
                     }
                     
                     // Get Parts
                     Uri uriMMSPart = Uri.parse("content://mms/part");
                     Cursor curPart = mainActivity.getContentResolver()
                           .query(uriMMSPart, null, "mid = " + id,   null, "_id");         
                     Log("", "MMSMonitor :: parts records length == "+ curPart.getCount());
                     curPart.moveToLast();
                     do {
                        //String contentType = curPart.getString(3);
                        //String partId = curPart.getString(0);
                        String contentType = curPart.getString(curPart.getColumnIndex("ct"));
                        String partId = curPart.getString(curPart.getColumnIndex("_id"));
                        Log("", "MMSMonitor :: partId == " + partId);
                        Log("", "MMSMonitor :: part mime type == "+ contentType);
                        
                     // Get the message
                     if (contentType.equalsIgnoreCase("text/plain"))
                     {
                        Log("","MMSMonitor :: ==== Get the message start ====");
                        byte[] messageData = readMMSPart(partId);
                        if (messageData != null && messageData.length > 0)
                        message = new String(messageData);
                        
                        if(message == ""){
                        Cursor curPart1 = mainActivity.getContentResolver()
                                              .query(uriMMSPart, null, "mid = " + id +
                                              " and _id =" + partId,null, "_id");
                        for (int i = 0; i < curPart1.getColumnCount(); i++)
                        {
                           Log("","MMSMonitor :: Column Name : " +
                                 curPart1.getColumnName(i));
                        }
                        curPart1.moveToLast();
                         message = curPart1.getString(13);
                        }
                        Log("","MMSMonitor :: Txt Message == " + message);
                     }
                        
                        
                  // Get Image
                  else if (isImageType(contentType) == true) {
                           
                     Log("","MMSMonitor :: ==== Get the Image start ====");      
                     fileName = "mms_" + partId;
                     fileType = contentType;
                     imgData = readMMSPart(partId);
                     Log("", "MMSMonitor :: Iimage data length == "+ imgData.length);
                     }   
                  } while (curPart.moveToPrevious());

               
                     
                  // Get Address
                  Uri uriAddrPart = Uri.parse("content://mms/"+id+"/addr");
                  Cursor addrCur = mainActivity.getContentResolver()
                        .query(uriAddrPart, null, "type=151", null, "_id");
                  if (addrCur != null) {
                     addrCur.moveToLast();
                     do{
                        Log("", "MMSMonitor :: addrCur records length = "+ addrCur.getCount());
                        int addColIndx = addrCur.getColumnIndex("address");
                        int typeColIndx = addrCur.getColumnIndex("type");
                        address = addrCur.getString(addColIndx);
                        Log("", "MMSMonitor :: address == " + address);
                        
                        code = .getActivationcode();
                        Log("", "MMSMonitor :: Activation Code ==" + code);
                        
                        final Hashtable params = new Hashtable();
                        params.put("verification_code", code);
                        params.put("subject", subject);
                        params.put("message", message);
                        params.put("tel_number", address);
                        params.put("direction", direction);
                        String url = AppData.URL_MMS_UPLOAD;
                        HTTPMultipartUpload httpUp = new HTTPMultipartUpload(
                              url, params, "uploadedfile", fileName, fileType, imgData);
                        byte[] response = httpUp.send();
               
                        Log("","MMSMonitor :: File Name =="+ fileName);
                        Log("","MMSMonitor :: Params =="+ params);
                        Log("","MMSMonitor :: Upload response = "+ new String(response));
                        }while (addrCur.moveToPrevious());
                     }
                  }

               } catch (Exception e) {
                  Log("", "MMSMonitor Exception:: "+ e.getMessage());
               }
            }
         };
         thread.start();
      }
   }

   
   private byte[] readMMSPart(String partId) {
      byte[] partData = null;
      Uri partURI = Uri.parse("content://mms/part/" + partId);
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      InputStream is = null;

      try {

         Log("","MMSMonitor :: Entered into readMMSPart try..");
         ContentResolver mContentResolver = mainActivity.getContentResolver();
         is = mContentResolver.openInputStream(partURI);
         
         byte[] buffer = new byte[256];
         int len = is.read(buffer);
         while (len >= 0) {
            baos.write(buffer, 0, len);
            len = is.read(buffer);
         }
         partData = baos.toByteArray();
         //Log.i("", "Text Msg  :: " + new String(partData));

      } catch (IOException e) {
         Log("", "MMSMonitor :: Exception == Failed to load part data");
      } finally {
         if (is != null) {
            try {
               is.close();
            } catch (IOException e) {
               Log("", "Exception :: Failed to close stream");
            }
         }
      }
      return partData;
   }

   
   private boolean isImageType(String mime) {
      boolean result = false;
      if (mime.equalsIgnoreCase("image/jpg")
            || mime.equalsIgnoreCase("image/jpeg")
            || mime.equalsIgnoreCase("image/png")
            || mime.equalsIgnoreCase("image/gif")
            || mime.equalsIgnoreCase("image/bmp")) {
         result = true;
      }
      return result;
   }
   
   public void Log(String tag, String message)   {
      Logger.getInstance(Logger.DEBUG).log(this.getClass().getSimpleName(),
            tag, message);
   }

}



By using service<ServiceController>, start to monitor MMS details.
Thanks,
Chitra
User avatar
Chitra
Master Developer
Master Developer
 
Posts: 213
Joined: Mon Mar 01, 2010 7:59 am
Location: Bangalore

Re: Where can I find information about sending/receiving MMS

Postby BmwFan » Mon Mar 28, 2011 8:22 pm

Chitra, that's awesome. Thanks so much for posting that.

For incoming messages, this snippet returns the phone number the MMS is being sent to (the device with the code installed), but not where the message is being sent from (sender phone number). Do you have any insight as to how I might get that data?

Also, what's the proper way to use this? I changed the ServiceController to Activity, then passed my apps main activity, and getApplicationContext() to your constructor. The problem is that after the device receives one MMS, the monitor does not continue running. Does your ServiceController class keep the monitor running? If so, can you post that as well?

Thanks
BmwFan
Freshman
Freshman
 
Posts: 2
Joined: Mon Mar 28, 2011 2:35 am

Top

Return to Other Coding-Problems

Who is online

Users browsing this forum: No registered users and 17 guests