Android Java USB плагин последовательной связи для Unity не работает - PullRequest
0 голосов
/ 25 сентября 2018

Я создал плагин Java, который использует устройства UsbManager для связи с указанным последовательным устройством.Я использую Android Studio для запуска плагина и могу писать на нужное устройство, но я не понимаю, как интегрировать мой код с Unity.Я передаю Контекст в конструкторе, чтобы я мог создать UsbManager, но я не знаю, как это сделать в Unity или есть ли другой способ получить Контекст.

Как правильно передать контекст изЕдинство с моим плагином?Я также не уверен, работает ли моя функция в Unity, потому что я не знаю, нужны ли разрешения для USB, а также в файле манифеста.

Код Unity:

void Start()
{
        ajc = new AndroidJavaObject("com.bebopsensors.dg.USBController");
        int connected = ajc.Call<int>("startUSB");
}

Java-код:

public class USBController {

    private Context context;
    private static final String ACTION_USB_PERMISSION = "com.bebopsensors.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;
        }
    };

1 Ответ

0 голосов
/ 25 сентября 2018

Как правильно передать Контекст из Unity в мой плагин?

C # сторона:

Ваш класс USBController имеетконструктор, который принимает Context в качестве аргумента.Перед вызовом функции startUSB получите Unity Context, а затем отправьте его в конструктор при создании экземпляра USBController.

Get Unity Context:

    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 Side:

В вашей функции startUSB теперь вы можете использовать Context с getSystemService.Я заметил, что вы прокомментировали это.Обратите внимание, что context.USB_SERVICE должно быть Context.USB_SERVICE.c в Context следует использовать заглавные буквы.

public int startUSB()
{
    usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
    ....
    ....
}

Не знаю, нужны ли разрешения для USB, а также в файле манифеста.

Не совсем уверен в этом, но я считаю, что вызова функции requestPermission, которую вы сделали, должно быть достаточно, чтобы справиться с этим.Если это не работает, тогда я предлагаю вам протестировать свою Java-программу только на Android и без Unity, чтобы проверить, работает ли она.Если это работает, предложенное мной решение также должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...