How to read incoming MMS and SMS messages on Android
Asked Answered
E

1

0

I know this is a big topic, as seen here and here, so I just wanted to post how I solved both the issue of receiving incoming MMS and SMS messages and the issue of grabbing data from those MMS and SMS messages on Android 9.0 version 28+ using Xamarin.Forms. This code can easily be translated to Java. Here is the completed Android app so you can try it yourself. It also shows how to do some Azure machine learning if you're interested in that.

For Broadcast Receivers: Classes, registering class instances , permissions needed.

Note that the broadcast receivers were added dynamically, they can be added statically using Xamarin's intent-filter decorator , or (if you're not using Xamarin) the AndroidManifest.xml file.

Erzurum answered 31/7, 2020 at 14:48 Comment(0)
E
0

Here is a code snippet to show how to parse incoming SMS data with a Broadcast Receiver:

public override void OnReceive(Context context, Intent intent)
    {
        Log.Info(TAG, "Intent action received: " + intent.Action);

        // Retrieve message from the intent and analyze it.
        SmsMessage msg = Android.Provider.Telephony.Sms.Intents.GetMessagesFromIntent(intent)[0];
        string message = msg.DisplayMessageBody;
        (string, bool) result = MMSReceiver.CleanUpMessage(message);

        // If there were one or more rooster words.
        if (result.Item2)
        {
            string title = "Rooster Text Received From: " + msg.DisplayOriginatingAddress;
            DependencyService.Get<INotificationManager>().ScheduleNotification(title, result.Item1);
        }   
    }

And here is a code snippet to show how to parse incoming MMS data with a Broadcast Receiver:

public override void OnReceive(Context context, Intent intent)
    {
        Log.Info(TAG, "Intent action received: " + intent.Action);

        // Get the MMS ID. Adapted from: https://mcmap.net/q/261423/-how-to-get-mms-id-android-application
        ContentResolver contentResolver = AndroidApp.Context.ContentResolver;
        Android.Net.Uri mmsInboxUri = Android.Net.Uri.Parse("content://mms");
        Android.Database.ICursor mmsInboxCursor = contentResolver.Query(mmsInboxUri, new string[]
            {"_id","msg_box","ct_t","date"}, "msg_box=1 or msg_box=2", null, null);
        int id = -1;
        if (mmsInboxCursor != null)
        {
            try
            {
                if (mmsInboxCursor.MoveToFirst())
                {
                    id = Int32.Parse(mmsInboxCursor.GetString(0));
                    Log.Info(TAG, "Id is this: " + mmsInboxCursor.GetString(0));
                }
            }
            catch (System.Exception error)
            {
                Log.Error(TAG, "Error requesting the MMS ID: " + error.Message);
            }
        }// if (mmsInboxCursor != null)

        // Get text and picture from MMS message. Adapted from: https://mcmap.net/q/259931/-how-to-read-mms-data-in-android
        string message = ""; // text
        Android.Graphics.Bitmap bitmap = null; // picture
        string selectionPart = "mid=" + id;
        Android.Net.Uri mmsTextUri = Android.Net.Uri.Parse("content://mms/part");
        Android.Database.ICursor cursor = contentResolver.Query(mmsTextUri, null,
            selectionPart, null, null);
        if (cursor.MoveToFirst())
        {
            do
            {
                string partId = cursor.GetString(cursor.GetColumnIndex("_id"));
                string type = cursor.GetString(cursor.GetColumnIndex("ct"));
                // Get text.
                if ("text/plain".Equals(type))
                {
                    string data = cursor.GetString(cursor.GetColumnIndex("_data"));
                    
                    if (data != null)
                    {
                        message = GetMmsText(partId);
                        Log.Info(TAG, "Body is this: " + message);
                    }
                    else
                    {
                        message = cursor.GetString(cursor.GetColumnIndex("text"));
                        Log.Info(TAG, "Body is this: " + message);
                    }
                }
                //Get picture.
                if ("image/jpeg".Equals(type) || "image/bmp".Equals(type) ||
                        "image/gif".Equals(type) || "image/jpg".Equals(type) ||
                        "image/png".Equals(type))
                {
                    bitmap = GetMmsImage(partId);
                }
            } while (cursor.MoveToNext());
        }// if (cursor.MoveToFirst())
    }
Erzurum answered 31/7, 2020 at 14:48 Comment(2)
it's fine to answer your own question, but please write it up as a proper answer according to the site rules. Simply linking to offsite repos is not a proper answer.Cussed
Thank you @Jason, I have added the relevant code snippets!Erzurum

© 2022 - 2024 — McMap. All rights reserved.