Как обнаружить устройства Bluetooth в плагине Unity Android? - PullRequest
0 голосов
/ 04 апреля 2020

Я разрабатываю Unity игру для Android, в которой используется Android Плагин для возможности отправки данных через Bluetooth во время игры. Отправка данных и установление соединения с сопряженным устройством работает нормально. Однако я не могу заставить обнаружение новых устройств Bluetooth работать.

В моем классе плагинов (который также обрабатывает отправляющие данные и т. Д., Что работает нормально):

 public void startBluetoothDeviceDiscovery(){

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        currentActivity.registerReceiver(receiver, filter);


        if (bluetoothAdapter.isDiscovering()){
            bluetoothAdapter.cancelDiscovery();
        }
        bluetoothAdapter.startDiscovery();

    }

Метод startBluetoothDeviceDiscovery вызывается наверняка (вызывается кнопкой), а адаптер Bluetooth уже установлен и не равен нулю. Bluetooth на устройстве всегда был включен.

Также внутри класса плагинов :

 BroadcastReceiver receiver = new MyBroadcastReceiver();

    public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {

                  // a device was found, do stuff

            }
        }
    }

В основном, что указывает документация Android при обнаружении новых устройств. https://developer.android.com/guide/topics/connectivity/bluetooth#DiscoverDevices

Я подумал, может быть, устройств просто нет, поэтому я хотел, чтобы приемник уже включался , когда обнаружение начинается , поэтому я попытался ищите BluetoothAdapter.ACTION_DISCOVERY_STARTED:

 IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        currentActivity.registerReceiver(receiver, filter);

И в моем Приемнике на onReceive :

@Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();

            if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {

                 // discovery started, do stuff

            }

        }

Это должно вызываться каждый раз, когда нажимается кнопка и вызывается метод startBluetoothDeviceDiscovery(), так как он всегда запускает обнаружение Bluetooth, но он все равно не работает.

Мое последнее предположение состояло в том, что из-за того, что плагин не является активным, BroadcastReceiver не может быть доступ. Поэтому я изменил действие на BluetoothAdapter.ACTION_STATE_CHANGED, а затем, когда я включил и выключил Bluetooth на моем устройстве, оно неожиданно было получено в onReceive().

Мой манифест (скопирован в правильное местоположение папки Unity). :

    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal">

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>

    <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

Так почему же я включаю bluetoothAdapter.startDiscovery() и нахожу устройства не полученными в приемнике?

Спасибо за помощь ANY или идеи:)

1 Ответ

0 голосов
/ 27 апреля 2020

Вы пробовали плагин Bluetooth в Unity Asset Store? Я делаю то же самое, но использую Bluetooth Classi c (H C -06) и использую плагин из магазина активов. Мое приложение будет использовать только этот модуль BT, поэтому в сценарии C# в Unity я написал:

    device = new BluetoothDevice();
    device.Name = "HC-05";
    //device.MacAddress = "XX:XX:XX:XX:XX:XX";
            device.send (System.Text.Encoding.ASCII.GetBytes ("Hello\n"));
        }
    }
    public void connect() {
        statusText.text = "Status : ...";
        device.connect();

    }

    public void disconnect() {
        device.close();
    }

    public void sendHello() {
        if (device != null) {
    void Update() {
        if (device.IsReading) {

            byte [] msg = device.read ();


            if (msg != null ) {


                string content = System.Text.ASCIIEncoding.ASCII.GetString (msg);

                statusText.text = "MSG : " + content;

            } 
        }
    }
}
...