Разъем Bluetooth подключить

Я пытаюсь получить все данные от устройства Bluetooth (Google Daydream Controller), чтобы реагировать на определенные пользовательские входы в приложении для Android. Я нашел веб-приложение ( https://github.com/mrdoob/daydream-controller.js), которое в значительной степени считывает данные так, как мне нужно. На самом деле мне нужна только обратная связь для кнопки приложения.

Но я не могу подключиться! При попытке подключения всегда возникает ошибка. Другие люди имеют подобный опыт, но в разных настройках.. Я не смог найти решение

public class TryAgain extends AppCompatActivity {

    private static final String UUID_SERIAL_PORT_PROFILE = "00001101-0000-1000-8000-00805F9B34FB";

    private static final String TAG = "tag";

    BluetoothAdapter mBluetoothAdapter;
    BluetoothDevice mDevice;
    private BluetoothSocket mSocket = null;
    private BufferedReader mBufferedReader = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_try_again);

        findBT();

        try {
            openDeviceConnection(mDevice);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    void findBT()
    {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if(mBluetoothAdapter == null)
        {
            System.out.println("No bluetooth adapter available");
        }

        if(!mBluetoothAdapter.isEnabled())
        {
            Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth, 0);
        }

        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
        if(pairedDevices.size() > 0)
        {
            for(BluetoothDevice device : pairedDevices)
            {
                if(device.getName().equals("Daydream controller"))
                {
                    mDevice = device;
                    break;
                }
            }
        }
        System.out.println("Bluetooth Device Found");
    }


    private void openDeviceConnection(BluetoothDevice device)
            throws IOException {
        InputStream aStream = null;
        InputStreamReader aReader = null;
        try {
            mSocket = device.createRfcommSocketToServiceRecord( getSerialPortUUID() );
            mSocket.connect();
            aStream = mSocket.getInputStream();
            aReader = new InputStreamReader( aStream );
            mBufferedReader = new BufferedReader( aReader );
        } catch ( IOException e ) {
            Log.e( TAG, "Could not connect to device", e );
            close( mBufferedReader );
            close( aReader );
            close( aStream );
            close( mSocket );
            throw e;
        }
    }

    private void close(Closeable aConnectedObject) {
        if ( aConnectedObject == null ) return;
        try {
            aConnectedObject.close();
        } catch ( IOException e ) {
        }
        aConnectedObject = null;
    }

    private UUID getSerialPortUUID() {
        return UUID.fromString( UUID_SERIAL_PORT_PROFILE );
    }
}

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

Сообщение об ошибке:

java.io.IOException: read failed, socket might closed or timeout, read ret: -1

1 ответ

Вам нужно позвонить openDeviceConnection из фонового потока, как это:

 Thread yourBGThread = new Thread( ){
    @Override
    public void run() {
        try {
            openDeviceConnection(mDevice);
        } catch (IOException  e) {
            e.printStackTrace();
        }
    }

};
yourBGThread.start();

Поместите этот код ниже findBT()

Другие вопросы по тегам