从共享库使用的Android USB串行端口。。。怎么用?
我正在开发一个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不是同一个主次字符设备从共享库使用的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
任何有安卓和串行端口经验的人,当然还有使用共享库中的串行端口的人?我使用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(或其他路径/设备)拥有权限。这不是一个解决方案,因为应用程序需要在无根设备上工作