Android Java Unity 的 USB 串行通信插件不是 运行
Android Java USB serial communication plugin for Unity not running
我创建了一个 Java 插件,它利用 UsbManager 设备与指定的串行设备进行通信。我正在使用 Android Studio 来 运行 插件并且可以写入适当的设备,但我不明白如何将我的代码与 Unity 集成。我在构造函数中传递了上下文,因此我可以创建 UsbManager,但我不知道如何在 Unity 中执行此操作,或者是否有其他方法来获取上下文。
将上下文从 Unity 传递到我的插件的正确方法是什么?我也不确定我的函数是否在 Unity 中工作,因为我不知道清单文件中的 USB 是否也需要权限。
统一代码:
void Start()
{
ajc = new AndroidJavaObject("com.company.dg.USBController");
int connected = ajc.Call<int>("startUSB");
}
Java代码:
public class USBController {
private Context context;
private static final String ACTION_USB_PERMISSION = "com.company.dg.USB_PERMISSION";
private final int BAUD_RATE = 19200;
private int bytesRead;
private byte[] readBuffer;
private UsbManager usbManager;
private UsbDeviceConnection connection;
private UsbSerialDevice serial;
private UsbDevice dg = null;
public USBController(Context context){
this.context = context;
}
public int startUSB(){
//usbManager = (UsbManager) context.getSystemService(context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
UsbDevice dg = null;
if(deviceList.size() == 0){
return -2;
}
// 1st and only device
dg = deviceList.values().iterator().next();
if(dg != null){
PendingIntent pi = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
usbManager.requestPermission(dataglove, pi);
UsbDeviceConnection connection = usbManager.openDevice(dataglove);
UsbSerialDevice serial = UsbSerialDevice.createUsbSerialDevice(dg, connection);
serial.open();
serial.setBaudRate(BAUD_RATE);
serial.setDataBits(UsbSerialInterface.DATA_BITS_8);
serial.setStopBits(UsbSerialInterface.STOP_BITS_1);
serial.setParity(UsbSerialInterface.PARITY_NONE);
serial.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
serial.read(callback);
} else {
return -1;
}
return 0;
}
private UsbSerialInterface.UsbReadCallback callback = new UsbSerialInterface.UsbReadCallback() {
@Override
public void onReceivedData(byte[] data) {
bytesRead = data.length;
readBuffer = data;
}
};
What's the proper way to pass the Context from Unity to my plugin?
C# 端:
您的 USBController
class 有一个以 Context
作为参数的构造函数。在调用 startUSB
函数之前,获取 Unity Context
然后在创建 USBController
.
实例时将其发送给构造函数
获取 Unity 上下文:
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
在创建它的实例时将上下文发送到您的 Java 代码:
ajc = new AndroidJavaObject("com.bebopsensors.dg.USBController", unityContext);
现在,您可以调用 startUSB
函数:
int connected = ajc.Call<int>("startUSB");
Java 边:
在您的 startUSB
函数中,您现在可以将 Context
与 getSystemService
一起使用。我注意到你评论了。请注意 context.USB_SERVICE
应该是 Context.USB_SERVICE
。 Context
中的c
要大写。
public int startUSB()
{
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
....
....
}
Don't know if permissions are needed for USB as well in the manifest
file.
对此不太确定,但我相信调用您所做的 requestPermission
函数应该足以处理该问题。如果这不起作用,那么我建议您仅在 Android 中测试您的 Java 程序,并且在没有 Unity 的情况下查看它是否有效。如果在那里有效,我建议的解决方案也应该有效。
我创建了一个 Java 插件,它利用 UsbManager 设备与指定的串行设备进行通信。我正在使用 Android Studio 来 运行 插件并且可以写入适当的设备,但我不明白如何将我的代码与 Unity 集成。我在构造函数中传递了上下文,因此我可以创建 UsbManager,但我不知道如何在 Unity 中执行此操作,或者是否有其他方法来获取上下文。
将上下文从 Unity 传递到我的插件的正确方法是什么?我也不确定我的函数是否在 Unity 中工作,因为我不知道清单文件中的 USB 是否也需要权限。
统一代码:
void Start()
{
ajc = new AndroidJavaObject("com.company.dg.USBController");
int connected = ajc.Call<int>("startUSB");
}
Java代码:
public class USBController {
private Context context;
private static final String ACTION_USB_PERMISSION = "com.company.dg.USB_PERMISSION";
private final int BAUD_RATE = 19200;
private int bytesRead;
private byte[] readBuffer;
private UsbManager usbManager;
private UsbDeviceConnection connection;
private UsbSerialDevice serial;
private UsbDevice dg = null;
public USBController(Context context){
this.context = context;
}
public int startUSB(){
//usbManager = (UsbManager) context.getSystemService(context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
UsbDevice dg = null;
if(deviceList.size() == 0){
return -2;
}
// 1st and only device
dg = deviceList.values().iterator().next();
if(dg != null){
PendingIntent pi = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
usbManager.requestPermission(dataglove, pi);
UsbDeviceConnection connection = usbManager.openDevice(dataglove);
UsbSerialDevice serial = UsbSerialDevice.createUsbSerialDevice(dg, connection);
serial.open();
serial.setBaudRate(BAUD_RATE);
serial.setDataBits(UsbSerialInterface.DATA_BITS_8);
serial.setStopBits(UsbSerialInterface.STOP_BITS_1);
serial.setParity(UsbSerialInterface.PARITY_NONE);
serial.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
serial.read(callback);
} else {
return -1;
}
return 0;
}
private UsbSerialInterface.UsbReadCallback callback = new UsbSerialInterface.UsbReadCallback() {
@Override
public void onReceivedData(byte[] data) {
bytesRead = data.length;
readBuffer = data;
}
};
What's the proper way to pass the Context from Unity to my plugin?
C# 端:
您的 USBController
class 有一个以 Context
作为参数的构造函数。在调用 startUSB
函数之前,获取 Unity Context
然后在创建 USBController
.
获取 Unity 上下文:
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
在创建它的实例时将上下文发送到您的 Java 代码:
ajc = new AndroidJavaObject("com.bebopsensors.dg.USBController", unityContext);
现在,您可以调用 startUSB
函数:
int connected = ajc.Call<int>("startUSB");
Java 边:
在您的 startUSB
函数中,您现在可以将 Context
与 getSystemService
一起使用。我注意到你评论了。请注意 context.USB_SERVICE
应该是 Context.USB_SERVICE
。 Context
中的c
要大写。
public int startUSB()
{
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
....
....
}
Don't know if permissions are needed for USB as well in the manifest file.
对此不太确定,但我相信调用您所做的 requestPermission
函数应该足以处理该问题。如果这不起作用,那么我建议您仅在 Android 中测试您的 Java 程序,并且在没有 Unity 的情况下查看它是否有效。如果在那里有效,我建议的解决方案也应该有效。