从共享库使用的Android USB串行端口。。。怎么用?

从共享库使用的Android USB串行端口。。。怎么用?,android,delphi,android-ndk,usb,shared-libraries,Android,Delphi,Android Ndk,Usb,Shared Libraries,我正在开发一个Android应用程序(EmbarcaderoDelphi10.3),它将使用HamLib库来控制收音机等等。我已经用NDK编译了这个库(libhamlib.so),并且可以正常工作。我可以使用Delphi创建的应用程序中的库,但只有在使用网络连接的情况下。(库连接到另一台机器,运行服务器以控制无线电) 然而,我们的目标是通过连接到Android设备的USB到串行适配器,直接从Android应用程序控制收音机 问题在于权限。我查看了一个根手机,它的/dev/ttyUSB0是在插入U

我正在开发一个Android应用程序(EmbarcaderoDelphi10.3),它将使用HamLib库来控制收音机等等。我已经用NDK编译了这个库(libhamlib.so),并且可以正常工作。我可以使用Delphi创建的应用程序中的库,但只有在使用网络连接的情况下。(库连接到另一台机器,运行服务器以控制无线电)

然而,我们的目标是通过连接到Android设备的USB到串行适配器,直接从Android应用程序控制收音机

问题在于权限。我查看了一个根手机,它的/dev/ttyUSB0是在插入USB串行适配器时创建的。但是设备上的权限是crw-------并且由root拥有。因此,应用程序没有使用该设备的权限

我尝试在AndroidManifest.xml中设置权限,并添加了意图(因此在插入USB适配器时会调用我的应用程序)

我还玩过UsbManager,它说这个应用程序有权限。不过,UsbManager将设备报告为/dev/bus/usb/001/001,因此有些地方不正确。如果我告诉库使用/dev/bus/usb/001/001,它也会失败。并且/dev/bus/usb/001/001与/dev/ttyUSB0不是同一个主次字符设备


任何有安卓和串行端口经验的人,当然还有使用共享库中的串行端口的人?

我使用Winsoft提供的用于安卓USB串行库的Comport,正如您在本页中看到的,它具有内置功能,可以获得用户使用Comport的权限。我正在粘贴我的一个项目中的一些代码,让您了解Winsoft库需要如何处理这些代码

procedure TfrmLiveMain.RefreshDevices;
var
  i: Integer;
  IDString: String;
  Device: JUsbDevice;
begin

  UsbDevices := UsbSerial.UsbDevices;
  if UsbDevices = nil then
    EXIT;

  if Length(UsbDevices) = 0 then
  begin
    Sound(50);
    Vibrate(25);
    FToast.MakeToast('No USB serial devices were found!');
    EXIT;
  end;

  for i := 0 to 1 {Length(UsbDevices)} - 1 do
  begin
    Device := UsbDevices[i];
    if TJBuild_VERSION.JavaClass.SDK_INT >= 21 then
      IDString := JStringToString(Device.getManufacturerName) + ' ' +
        JStringToString(Device.getProductName)
    else
      IDString := JStringToString(Device.getDeviceName);
  end;

  if not UsbSerial.IsSupported(Device) then
    raise Exception.Create(IDString + ' is not a supported device!');

  // give them 2 chances to grant permission
  if not UsbSerial.HasPermission(Device) then
  begin
    UsbSerial.RequestPermission(Device);
    if not UsbSerial.HasPermission(Device) then
    begin
      PermTimer.Enabled := True; // begin permission loop ->
      EXIT;
    end;
  end;

procedure TfrmLiveMain.PermTimerTimer(Sender: TObject);
var
  Device: JUsbDevice;
begin
  PermTimer.Enabled := False;
  Device := UsbDevices[0];
  if UsbSerial.HasPermission(Device) then
    RefreshDevices; // and try open ->
end;

当然,我不能说这是否是Hamlib库所需要的,所以这是一个扩展的注释,并不是一个真正的答案

您可以尝试使用库,将其编译成文件并将其添加到您的Delphi项目中

如果我以root用户身份在手机chmod 777/dev/ttyUSB0 setEnforce0(设置权限以便每个人都可以读/写)上执行以下操作,并将SELinux设置为permissive,那么应用程序就会工作。这表明这显然是一个许可问题。我的应用程序需要对USB串行适配器的/dev/ttyUSB0(或其他路径/设备)拥有权限。这不是一个解决方案,因为应用程序需要在无根设备上工作