Ich versuche hier gerade ein USB Schnittstelle anzusprechen, in JAVA funktioniert es, unter Delphi irgendwie nicht.
Die Übergabe von einem TJavaArray funktioniert irgendwie nicht.
In JAVA funktioniert folgender Quelltext:
Code:
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbManager;
public void onClick(View v) {
UsbManager USBManager = null;
UsbAccessory[] AccessoryList = null;
UsbAccessory Accessory = null;
USBManager = (UsbManager) this.getSystemService(this.USB_SERVICE);
AccessoryList = USBManager.getAccessoryList();
Accessory = AccessoryList[0];
if (Accessory != null) {
SendDebug("Accessory Descriptions: " + Accessory.getDescription());
} else {
SendDebug("Accessory null");
}
}
In Delphi hab ich mir jetzt mit Hilfe von diesem Beispiel
http://www.bverhue.nl/g2dev/?p=65
und diesem Importiertem Interface:
https://github.com/FMXExpress/androi...UsbManager.pas
Delphi-Quellcode:
[JavaSignature('
android/hardware/usb/UsbManager')]
JUsbManager =
interface(JObject)
['
{4103C58D-D2FF-4010-B24E-0B970AB95F30}']
function getAccessoryList : TJavaArray<JUsbAccessory>;
cdecl;
// ()[Landroid/hardware/usb/UsbAccessory; A: $1
function getDeviceList : JHashMap;
cdecl;
// ()Ljava/util/HashMap; A: $1
function hasPermission(accessory : JUsbAccessory) : boolean;
cdecl;
overload;
// (Landroid/hardware/usb/UsbAccessory;)Z A: $1
function hasPermission(device : JUsbDevice) : boolean;
cdecl;
overload;
// (Landroid/hardware/usb/UsbDevice;)Z A: $1
function openAccessory(accessory : JUsbAccessory) : JParcelFileDescriptor;
cdecl;
// (Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor; A: $1
function openDevice(device : JUsbDevice) : JUsbDeviceConnection;
cdecl;
// (Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection; A: $1
procedure requestPermission(accessory : JUsbAccessory; pi : JPendingIntent) ;
cdecl;
overload;
// (Landroid/hardware/usb/UsbAccessory;Landroid/app/PendingIntent;)V A: $1
procedure requestPermission(device : JUsbDevice; pi : JPendingIntent) ;
cdecl;
overload;
// (Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V A: $1
end;
TJUsbManager =
class(TJavaGenericImport<JUsbManagerClass, JUsbManager>)
end;
auf den USB Manager komme ich noch, und USBManager.ToString gibt mir auch noch "android.hardware.usb.UsbManager@413c1250" aus
Auch die Accessorylist kann ich noch zuweisen, und diese gibt mir die richtige Länge von 1 (wenn ein Gerät angeschlossen ist, ansonsten ist sie nil)
Nur wenn ich auf item[0] zugreifen will, geht das nicht.
Delphi-Quellcode:
var JavaObject : JObject;
UsbManager : JUSBManager;
AccessoryList : TJavaArray<JUsbAccessory>;
Accessory : JUsbAccessory;
begin
try
// Get pointer to UsbManager
JavaObject := SharedActivityContext.getSystemService(TJContext.JavaClass.USB_SERVICE);
UsbManager := TJUSBManager.Wrap((JavaObject as ILocalObject).GetObjectID);
AccessoryList := UsbManager.getAccessoryList;
// das geht noch
mmlog.Lines.Add('Lenght: ' + inttostr( AccessoryList.Length));
// das geht schief mit:
// Zugriffsverletzung bei Adresse 5574A848 beim Zugriff auf Adresse 00000000
Accessory := AccessoryList.Items[0];
was mach ich jetzt noch falsch?
Vielen Dank!
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.