Can't figure out what I'm doing wrong with AndroidJavaClass - SMSManager

I’m trying to send a multipart sms, I got sendTextMessage to work but it has a text limit.
Any help would be appreciated!!

        AndroidJavaClass SMSManagerClass = new AndroidJavaClass("android.telephony.SmsManager");
        AndroidJavaObject SMSManagerObject = SMSManagerClass.CallStatic<AndroidJavaObject>("getDefault");

        AndroidJavaObject dividedMessage = SMSManagerObject.Call<AndroidJavaObject>("divideMessage", text);

        for (int i = 0; i < dividedMessage.Call<int>("size"); i++)
        {
            texts.Add(dividedMessage.Call<string>("get", i));
        }

        SMSManagerObject.Call("sendMultipartTextMessage", phone, null, texts, null, null, zero);

Logcat says this:

Unity Error : at UnityEngine._AndroidJNIHelper.GetSignature (System.Object obj) [0x003a4] in :0

Unity at UnityEngine._AndroidJNIHelper.GetSignature (System.Object args) [0x00036] in :0

Unity at UnityEngine._AndroidJNIHelper.GetMethodID (System.IntPtr jclass, System.String methodName, System.Object args, System.Boolean isStatic) [0x00001] in :0

Unity at UnityEngine.AndroidJNIHelper.GetMethodID (System.IntPtr jclass, System.String methodName, System.Object args, System.Boolean isStatic) [0x00001] in :0

Unity at UnityEngine.AndroidJavaObject._Call (System.String methodName, System.Object args) [0x0000c] in :0

Unity at UnityEngine.AndroidJavaObject.Call (System.String methodName, System.Object args) [0x00001] in :0

Unity at SendSMS.SendProcess () [0x00114] in :0

SOLVED!

        AndroidJavaClass SMSManagerClass = new AndroidJavaClass("android.telephony.SmsManager");
        AndroidJavaObject SMSManagerObject = SMSManagerClass.CallStatic<AndroidJavaObject>("getDefault");

        AndroidJavaObject dividedMessage = SMSManagerObject.Call<AndroidJavaObject>("divideMessage", text);

        for (int i = 0; i < dividedMessage.Call<int>("size"); i++)
        {
            texts.Add(dividedMessage.Call<string>("get", i));
        }

        SMSManagerObject.Call("sendMultipartTextMessage", phone, null, ToJavaList(texts), null, null, zero);

       private AndroidJavaObject ToJavaList(List<string> strings)
{
    AndroidJavaObject list = new AndroidJavaObject("java.util.ArrayList");
    foreach (string s in strings)
    {
        list.Call<bool>("add", new AndroidJavaObject("java.lang.String", s));
    }
    return list;
}

You only got the call stack from logcat, there should also have been a error message that explains what exactly the issue is.

But from the call stack it seems that it couldn’t find a method that matches the parameters you’ve passed.

Probably because AndroidJavaObject doesn’t support any non-primitive types:

Important: You must access any non-primitive type as an AndroidJavaObject. The only exception is a string which you access directly, even though they don’t represent a primitive type in Java.

But it seems texts is a C# list? You’ll have to create a Java list using AndroidJavaObject instead.

At some point, it becomes easier to write a small Java plugin that provides a simple API which is easier to call from Unity. I found that creating an Android Library Project inside the project is pretty straightforward.

1 Like

THANK YOU SO MUCH! Appreciate you. Spent 4 hours on this :slight_smile:

This solved it!

        SMSManagerObject.Call("sendMultipartTextMessage", phone, null, ToJavaList(texts), null, null);

        private AndroidJavaObject ToJavaList(List<string> strings)
            {
                AndroidJavaObject list = new AndroidJavaObject("java.util.ArrayList");
                foreach (string s in strings)
                {
                    list.Call<bool>("add", new AndroidJavaObject("java.lang.String", s));
                }
                return list;
            }