0

I'm writting sms application, which get from server by restapi number and message where to send and also receive sms from receipent. I have issue when received sms has more than 160 characters. And issue is when I have more than 160 characters to send by SMS.

Receive sms code:

public override void OnReceive(Context context, Intent intent)
    {
        if (intent.HasExtra("pdus"))
        {
            var smsArray = (Java.Lang.Object[])intent.Extras.Get("pdus");

            foreach(var item in smsArray)
            {
                var sms = SmsMessage.CreateFromPdu((byte[])item);

                SendReceivedStatus(sms.OriginatingAddress, sms.MessageBody);
            }
        }
    }

SendReceivedStatus(sms.OriginatingAddress, sms.MessageBody);

It's a my method that convert to json receipentNumber and message.

Now my send sms code:

var sent = PendingIntent.GetBroadcast(Application.Context, 0, new Intent("SMS_SENT"), 0);

SmsManager.Default.SendTextMessage(responseModel.receipent, null, responseModel.message, sent, null);

protected override void OnResume()
    {
        base.OnResume();

        var smsSentReceiver = new SMSSentReceiver();

        RegisterReceiver(smsSentReceiver, new IntentFilter("SMS_SENT"));
    }

public override void OnReceive(Context context, Intent intent)
    {
        switch ((int)ResultCode)
        {
            case (int)Result.Ok:

                SenderActivity.resultsms = true;
                SendStatus();

                break;
            case (int)SmsResultError.GenericFailure:

                SenderActivity.resultsms = false;
                SendStatus();

                break;
            case (int)SmsResultError.NoService:

                SenderActivity.resultsms = false;
                SendStatus();

                break;
            case (int)SmsResultError.NullPdu:

                SenderActivity.resultsms = false;
                SendStatus();

                break;
            case (int)SmsResultError.RadioOff:

                SenderActivity.resultsms = false;
                SendStatus();

                break;
        }
    }

How to pack these messages?

coldzero
  • 25
  • 1
  • 1
  • 8
  • What is the issue? It is hard to help you when you havn't stated the problem in the first place – Demitrian Jan 18 '17 at 11:34
  • I need convert this from java to C#. http://stackoverflow.com/questions/13598725/receive-and-concatenation-sms-more-than-160-characters-in-android – coldzero Jan 18 '17 at 11:46
  • I need to receive sms with more than 160 characters to string type. – coldzero Jan 18 '17 at 11:46

1 Answers1

3

Since SmsMessage.CreateFromPdu((byte[])) is deprecated since Android API level 19, here I also provide method to receive message more than 160 characters after KitKat version, here is my demo:

[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SMSReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Bundle bundle = intent.Extras;
        if (bundle != null)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
            {
                SmsMessage[] msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
                var smstext = new StringBuilder();
                foreach (var msg in msgs)
                {
                    smstext.Append(msg.DisplayMessageBody.ToString());
                }
                Console.WriteLine(smstext.ToString());//output the received sms
            }
            else
            {
                var smsArray = (Java.Lang.Object[])bundle.Get("pdus");
                SmsMessage[] messages = new SmsMessage[smsArray.Length];
                for (int i = 0; i < smsArray.Length; i++)
                {
                    messages[i] = SmsMessage.CreateFromPdu((byte[])smsArray[i]);
                }
                StringBuilder content = new StringBuilder();
                if (messages.Length > 0)
                {
                    foreach (var message in messages)
                    {
                        content.Append(message.DisplayMessageBody.ToString());
                    }
                }
                Console.WriteLine(content.ToString());//output the received sms
            }
        }
        Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
    }
}

I've tested my demo on Android 6.0 device and it works fine, I now can't find a Android 4.0 device for testing, but I think the method should work here. Any problem about this issue, please leave a comment.

Grace Feng
  • 16,564
  • 2
  • 22
  • 45