Не могу сбрасывать из типа источника в тип назначения (jnienv.getarray (pudis.handle);)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не могу сбрасывать из типа источника в тип назначения (jnienv.getarray (pudis.handle);)

Сообщение Anonymous »

Я пытаюсь получать SMS в своем приложении.
В моем проекте есть класс BroadcastReceiver, и я получаю ошибку времени выполнения:

System.InvalidCastException: невозможно привести исходный тип к
целевому типу. at (castclass оболочки)
object._castclass_with_cache (object,intptr,intptr) at Android.Runtime.JNIEnv.CopyArray
(intptr,Java.Lang.Object[]) в at
Android.Runtime.JNIEnv.GetArray (intptr)

at Messages.SMSBroadcastReceiver.OnReceive
(Android.Content.Context, Android.Content.Intent) [0x0005f] в
c:\Users\Jase\Documents\Projects\Messages\Messages\SMSBroadcastReceiver.cs:36
at
Android.Content.BroadcastReceiver.n_OnReceive_Landroid_content_Context_Landroid_content_Intent
(intptr,intptr ,интптр,интптр) [0x00019] в
/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 (обертка динамический-метод)
object.145a0c82-0de6-4c2c-90a0-3654436a06c3
(intptr,intptr,intptr,intptr)

Вот код, который я используя:

Код: Выделить всё

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(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();
}
}
}
Я пытался найти решение и искал, но ни одно из существующих решений этой ошибки не сработало. Что я могу попробовать дальше?

Я обновляю этот вопрос:

Код: Выделить всё

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
< /code>
Я также хотел бы отметить, что я пробовал много вещей, чтобы решить эту проблему. Я сейчас (действительно) на странице 60 результатов поиска Google, пытаясь найти  что -то . Проблема в том, что ни одно из решений, которые я нашел в Интернете для этой той же самой ошибки, на самом деле не работает, потому что они в основном просто крошечные варианты одного и того же утверждения, просто написанные немного по -другому, но делает то же самое, которое создает одно и то же исключение . < /p>
Я также попробовал следующее: < /p>
//                    var castedPdus = JNIEnv.GetObjectArrayElement(pdus.Handle, 0);
//                    Object castedPdus = (Object)bundle.Get("pdus");
//                    var castedPdus = JNIEnv.GetArray(pdus.Handle);
безуспешно.
В зависимости от того, какой оператор я использую, исключения варьируются от «Невозможно привести тип источника к типу назначения» до «Невозможно преобразовать объект[] в объект». Ну, да. Но проблема не в том, что я «делаю это неправильно», а в том, что нам велят делать это «неправильно». В Xamarin нет другого способа получения SMS, который я могу найти в Интернете. Кажется, что каждый пример в Интернете основан на этом фрагменте кода - плюс-минус несколько незначительных изменений.

Подробнее здесь: https://stackoverflow.com/questions/275 ... -lang-obje
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»