Java.Lang GetClass в С#

Я пытаюсь передать пин-код на устройство Bluetooth в моем собственном приемнике в Android-части моего приложения Xamarin Forms. Я получаю правильную стадию действия, но у меня проблемы с получением методов setPin и convertPinToBytes. Я последовал предложению, найденному здесь: https://stackoverflow.com/a/19776382/13902576, но у меня возникли проблемы с преобразованием этого в C#.

Моя реализация выглядит следующим образом:

var convert = device.BluetoothClass.Class.GetMethod("convertPinToBytes", Java.Lang.Class.FromType(typeof(Java.Lang.String)));
byte[] pin = (byte[])convert.Invoke(device.BluetoothClass.Class, "1234");
var setPin = device.BluetoothClass.Class.GetMethod("setPin", Java.Lang.Class.FromType(typeof(Java.Lang.Byte)));
var connectResult = (bool)setPin.Invoke(device, pin);
Console.WriteLine(connectResult);

Я получаю следующее исключение:

java.lang.NoSuchMethodException: convertPinToBytes [class java.lang.String]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at crc6444c83b34196acfb6.BluetoothInstance_BluetoothReceiver.n_onReceive(Native Method)
at crc6444c83b34196acfb6.BluetoothInstance_BluetoothReceiver.onReceive(BluetoothInstance_BluetoothReceiver.java:29)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52226(LoadedApk.java:1319)
at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4)
at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Любые предложения будут оценены, спасибо!

Обратите внимание, что переменная device имеет тип Android.Bluetooth.BluetoothDevice.

itcoder 11.12.2020 03:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В С# появилось собственное решение. Поскольку в C# есть экземпляр класса BluetoothDevice, некоторые из этих методов доступны.

Решение можно значительно упростить, выполнив следующие действия:

byte[] pin = Encoding.UTF8.GetBytes("1234");
var setPin = device.SetPin(pin);

В итоге я исправил ошибку первого метода, используя вместо этого:

var deviceClass = Java.Lang.Class.ForName(device.Class.CanonicalName);
var convert = deviceClass.GetMethod("convertPinToBytes", Java.Lang.Class.FromType(typeof(Java.Lang.String)));

Я не мог исправить ошибку метода setPin. Однако мое окончательное решение взято из примера выше.

Другие вопросы по теме