Cannot cast from source type to destination type (JNIEnv.GetArray<Java.Lang.Object>(pudis.Handle);)
I am trying to receive SMS in my app.
I've got a BroadcastReceiver class in my project and I am receiving a runtime error:
System.InvalidCastException: Cannot cast from source type to destination type. at at (wrapper castclass) object._castclass_with_cache (object,intptr,intptr) <IL 0x0002c, 0x00080> at at Android.Runtime.JNIEnv.CopyArray<Java.Lang.Object> (intptr,Java.Lang.Object[]) <0x002a3> at at Android.Runtime.JNIEnv.GetArray<Java.Lang.Object> (intptr) <0x0021f>
at Messages.SMSBroadcastReceiver.OnReceive (Android.Content.Context,Android.Content.Intent) [0x0005f] in c:\Users\Jase\Documents\Projects\Messages\Messages\SMSBroadcastReceiver.cs:36 at Android.Content.BroadcastReceiver.n_OnReceive_Landroid_content_Context_Landroid_content_Intent (intptr,intptr,intptr,intptr) [0x00019] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.20-series/ba9bbbdd/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.Content.BroadcastReceiver.cs:334 at at (wrapper dynamic-method) object.145a0c82-0de6-4c2c-90a0-3654436a06c3 (intptr,intptr,intptr,intptr) <IL 0x0001d, 0x0004b>
Here's the code that I'm using:
using System;
using System.Text;
using Android.App;
using Android.OS;
using Android.Content;
using Android.Runtime;
using Android.Util;
using Android.Widget;
using Android.Telephony;
using Environment = System.Environment;
namespace Messages
{
[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SMSBroadcastReceiver : BroadcastReceiver
{
private const string Tag = "SMSBroadcastReceiver";
private const string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent intent)
{
Log.Info(Tag, "Intent: " + intent.Action);
if (intent.Action != IntentAction)
return;
var bundle = intent.Extras;
if (bundle == null)
return;
var pdus = bundle.Get("pdus");
// ********** This is the error line at runtime ****************
var castedPdus = JNIEnv.GetArray<Java.Lang.Object>(pdus.Handle);
var messages = new SmsMessage[castedPdus.Length];
var stringBuilder = new StringBuilder();
for (int i = 0; i < messages.Length; i++)
{
var bytes = new byte[JNIEnv.GetArrayLength(castedPdus[i].Handle)];
JNIEnv.CopyArray(castedPdus[i].Handle, bytes);
messages[i] = SmsMessage.CreateFromPdu(bytes);
stringBuilder.Append(String.Format("SMS from: {0}{1}Body: {2}{1}", messages[i].OriginatingAddress,
Environment.NewLine, messages[i].MessageBody));
}
Toast.MakeText(context, stringBuilder.ToString(), ToastLength.Long).Show();
}
}
}
I've been trying to come up with a solution and have been searching but none of the existing solutions to this error have worked. What can I try next?
I'm updating this question with:
Bundle not null: Bundle[mParcelledData.dataSize=256]
PDUS: [[B@5s294833
PDUS Handle: 2065454
Cannot cast from source type to destination type. at (wrapper castclass) object:__castclass_with_cache (object,intptr,intptr)
at Android.Runtime.JNIEnv.CopyArray[Object] (IntPtr src, Java.Lang.Object[] dest) [0x00078] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.20-series/ba9bbbdd/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:946
at Android.Runtime.JNIEnv.GetArray[Object] (IntPtr array_ptr) [0x00053] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.20-series/ba9bbbdd/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:1211
at Java.Lang.Object.ToArray[Object] () [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.20-series/ba9bbbdd/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:338
at Java.Lang.Object.op_Explicit (Java.Lang.Object value) [0x00008] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.20-series/ba9bbbdd/source/monodroid/src/Mono.Android/src/Java.Lang/Object.cs:499
at Messages.SMSBroadcastReceiver.OnReceive (Android.Content.Context context, Android.Content.Intent intent) [0x000ba] in c:\Users\Jase\Documents\Projects\Messages\Messages\SMSBroadcastReceiver.cs:52
I'd also like to note that I have tried many things to resolve this issue. I am now (really) on page 60 of Google's search results, trying to find something. Problem is, none of the solutions I've found online for this exact same error actually work because they're basically just tiny little variatings of the same statement, just written in a slightly different way but does the same thing which produces the same exception.
I have also tried the following:
// var castedPdus = JNIEnv.GetObjectArrayElement(pdus.Handle, 0);
// Object castedPdus = (Object)bundle.Get("pdus");
// var castedPdus = JNIEnv.GetArray<Java.Lang.Object>(pdus.Handle);
without any luck.
Depending on which statement I use, exceptions vary from "Cannot cast from source type to destination type", to "Cannot convert object[] to object". Well, duh. But the issue is not that I'm "doing it wrong", it's that we're told to do it "wrong". There is no other way of receiving an SMS in Xamarin that I can find online. Every single example online seems to be based off of this one code snippet - give or take a few minor alterations.
Source: View source