Разъем для прослушивания через Bluetooth, не реагирующий на наушники Bluetooth - PullRequest
0 голосов
/ 11 февраля 2019

Здравствуйте,

Мне пришла в голову сумасшедшая идея попробовать программно подключиться к моим Apple AirPods с моего устройства Android и попытаться «зарегистрировать» входящие сигналы (например, когда AirPod дважды ударяется, извлекаетсяуха, отчеты о батарее и т. д.) Так как я никогда раньше не пробовал никаких устройств с Android-Bluetooth, я изучил некоторые документы, посмотрел несколько уроков и написал следующий код:

//In my main activity, this gets called when my AirPods have been successfully connected to my Android device
private void connectedToDevice(BluetoothDevice device)
{
    mLog("Attempting to read data...");
    BTConnectionService mConnection = new BTConnectionService();
}

И это BTConnectionServiceкласс:

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

private final BluetoothAdapter mBluetoothAdapter;

private AcceptThread mAcceptThread;
private ConnectedThread mConnectedThread;

public BTConnectionService(Context context)
{
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    start();
}

private class AcceptThread extends Thread {

    private final BluetoothServerSocket mServerSocket;

    public AcceptThread()
    {
        BluetoothServerSocket tmp = null;

        try
        {
            tmp = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(APP_NAME, MY_UUID);
            Log.d(TAG, "AcceptThread: BluetoothServerSocket established."); 
        }
        catch (IOException e) { e.printStackTrace(); }

        mServerSocket = tmp;
    }

    public void run()
    {
        BluetoothSocket socket = null;

        try { socket = mServerSocket.accept();
            Log.d(TAG, "run: mServerSocket.accept()"); }
        catch (IOException e) { e.printStackTrace(); cancel(); }

        if(socket != null)
        {
            mConnectedThread = new ConnectedThread(socket);
            mConnectedThread.start();
        }
    }

    public void cancel()
    {
        try { mServerSocket.close(); } catch (IOException e) { e.printStackTrace(); }
    }
}

private class ConnectedThread extends Thread {

    private final BluetoothSocket mSocket;
    private final InputStream mInStream;

    public ConnectedThread(BluetoothSocket socket)
    {
        mSocket = socket;
        InputStream tmpIn = null;

        try { tmpIn = mSocket.getInputStream(); }
        catch (IOException e) {e.printStackTrace();}

        mInStream = tmpIn;

        Log.d(TAG, "ConnectedThread: set up");
    }

    public void run()
    {
        byte[] buffer = new byte[1024];
        int bytes; //bytes returned from read()

        while(true)
        {
            try
            {
                bytes = mInStream.read(buffer);
                Log.d(TAG, "READ: " + bytes);
            }
            catch (IOException e) { break; }
        }
    }
}

public synchronized void start()
{
    Log.d(TAG, "BTConnectionService started.");
    if(mAcceptThread == null)
    {
        mAcceptThread = new AcceptThread();
        mAcceptThread.start();
    }
}

Моя проблема в том, что mServerSocket.accept() никогда ничего не возвращает.Нужно ли как-то сопоставлять «имя» и «uuid», которые я передаю методу listenUsingInsecureRfcommWithServiceRecord, с целевым устройством, или что я делаю неправильно?Я очень новичок в этом.Мой код кажется мне слишком расплывчатым, он вообще не учитывает мое подключенное устройство, но это единственное, что я могу найти в Интернете.Большое спасибо заранее.

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