Перейти к содержанию
Fire Monkey от А до Я
  • 0

Работа с android.hardware.usb.UsbManager


destroyer86

Вопрос

Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.

Теперь сам вопрос в JavaInterfaces.pas есть описание:

 

  JUsbManagerClass = interface(JObjectClass)
    ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}']
    {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl;
    {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl;
    {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl;
    {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl;
    {class} function _GetEXTRA_ACCESSORY: JString; cdecl;
    {class} function _GetEXTRA_DEVICE: JString; cdecl;
    {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl;
    {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated
    {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated
    {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated
    {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated
    {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED;
    {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED;
    {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED;
    {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED;
    {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY;
    {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE;
    {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED;
  end;

  [JavaSignature('android/hardware/usb/UsbManager')]
  JUsbManager = interface(JObject)
    ['{6F603A25-E816-4012-9B23-054B428A4A75}']
    function getDeviceList: JHashMap; cdecl;//Deprecated
    function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated
    function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated
    procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated
  end;
  TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end;

Что бы получить доступ к методам интерфейса используется следующая конструкция:

  JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE);
  FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID);

теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass

Вот пример кода на Java, который хочу реализовать в Delphi:

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

    List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
    if (availableDrivers.isEmpty()) {
        return;
    }

    // Open a connection to the first available driver.
    UsbSerialDriver driver = availableDrivers.get(0);

	//Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi
    UsbDeviceConnection connection = manager.openDevice(driver.getDevice());

Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?

Изменено пользователем Andrey Efimov
Изменил заголовок, т.к. вопрос касается именно android.hardware.usb.UsbManager
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Попробуйте так:

var
	Device: JUsbDeviceConnection;

...

Device := FUsbManager.JavaClass.openDevice();

 

p.s. Учитывайте тот факт, что обёртка могла сгенериться неправильно. Java2Op не всегда отрабатывает как надо, поэтому появляется необходимость проверки и правки результата.

p.s.2. И вроде как у вас как раз такой случай... Попробуйте вот эту:

  JUsbManagerClass = interface(JObjectClass)
    ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}']
    {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl;
    {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl;
    {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl;
    {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl;
    {class} function _GetEXTRA_ACCESSORY: JString; cdecl;
    {class} function _GetEXTRA_DEVICE: JString; cdecl;
    {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl;
    {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED;
    {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED;
    {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED;
    {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED;
    {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY;
    {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE;
    {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED;
  end;

  [JavaSignature('android/hardware/usb/UsbManager')]
  JUsbManager = interface(JObject)
    ['{6F603A25-E816-4012-9B23-054B428A4A75}']
    function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated
    function getDeviceList: JHashMap; cdecl;//Deprecated
    function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated
    function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated
    function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated
    function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated
    procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated
    procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated 
  end;
  TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end;

 

p.s.3. С правилами создания обёртки можно ознакомиться тут https://delphifmandroid.blogspot.com/2014/07/java.html

Статья старая, но правила связанные с полями/константами и методами действительны по сей день.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Похожий контент

    • Автор Delpher-X
      Вопрос: как спрятать главную форму приложения в FMX? В VCL это делается просто - Project>View Source>вписываешь в открывшемся окне Application.ShowMainForm := False, однако в FMX такой фокус не прокатывает, там просто свойства такого нет - ShowMainForm. Как же быть? 
    • Автор Delpher-X
      Пытаюсь программно добавить в своем проекте компонент IdFTP: 
      FTPBot : TIdFTP; FTPBot := TIdFTP.Create(); FTPBot.Name := 'FTPGhost'; FTPBot.Passive := True; FTPBot.Host := ''; FTPBot.Username := ''; FTPBot.Password := ''; Код компилируется нормально. 
      Однако, когда я пытаюсь обратиться к свойству TransferType полученного объекта: 
      FTPBot.TransferType.ftBinary; Программа при компиляции вылетает с ошибкой, утверждает что нельзя так писать. В чем дело? 
    • Автор Simons Cat
      У меня среда программирования rad studio Delphi 10.4.2. Собственно ищу совета как отправить и получить ответ на запрос USSD.
      Нашел в интернете единственный пример более или менее который похож на правду.
      Привел его к виду нормальному виду, но не хватает знаний как передать функцию CallBack.
      procedure TForm7.Button6Click(Sender: TObject); var Temp:Jstring; ResponceCallBack: JTelephonyManager_UssdResponseCallback; handler: JHandler; begin     TM :=TJTelephonyManager.Create;   handler := TJHandler.Create;   ResponceCallBack := TJTelephonyManager_UssdResponseCallback.Wrap(   TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE));    TM.sendUssdRequest(StringToJString('*100#'), ResponceCallBack,handler);   end;  
      На java делается вот так. Не знаю как этот код переделать в delphi.
      TelephonyManager =  telephonyManager(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);     Handler handler = new Handler();     TelephonyManager.UssdResponseCallback callback = new TelephonyManager.UssdResponseCallback() {         @Override         public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {             super.onReceiveUssdResponse(telephonyManager, request, response);             Log.e("ussd",response.toString());           }           @Override         public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {             super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);             Log.e("ussd","failed with code " + Integer.toString(failureCode));         }     };       try {            Log.e("ussd","trying to send ussd request");            telephonyManager.sendUssdRequest("*123#",                     callback,                     handler);         }catch (Exception e){                 String msg= e.getMessage();             Log.e("DEBUG",e.toString());             e.printStackTrace();         }  
    • Автор Delpher-X
      Я обратил внимание, что если в VCL цвет формы, а также некоторых других компонентов можно менять, то в FMX это сделать нельзя - доступен только дефолтно-серый, во всяком случае, при компиляции под Android. Есть ли какие-то способы это поправить? 
    • Автор Delpher-X
      У меня есть следующий код, который передает данные из потока в объект типа TStrings: 
      var F : TMemoryStream; S : TStrings; begin F := TMemoryStream.Create; S := TStringList.Create; F.LoadFromFile('C:/File.jpg'); S.LoadFromStream(F); Из TMemoryStream в TStrings все передается нормально. Однако - как обратно? Как снова преобразовать объект TString в поток данных, дабы снова можно было бы сохранить его в полноценный файл? 
    • Автор slav_z
      Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!
      Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать,

      получаем проблемы в виде срабатывания разных событий типа OnClick элементов.
      Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга.
      Делаем следующее:

      Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее...
      Удачи!
      https://github.com/slav-libx/scroll-click.git
    • Автор uakmal
      Здравствуйте!
      Создаю медиаплеер для Android TV. 
      Запускаю плеер, нажимаю на условную кнопку, которая делает следующее: 
      MediaPlayer1.FileName:='/storage/emulated/0/download/1.mp4'; После нажатия вылетает окошко с надписью:
      java.lang.java.lang.illegalargumentexception после закрытия окошки нажимаю на play, но ничего не происходит.
      Подскажите, пожалуйста как исправить это?
    • Автор Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • Автор Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • Автор Delpher-X
      У меня есть код, который должен скачивать файл с сайта: 
      var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.  
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...