Здравствуйте,
Мне пришла в голову сумасшедшая идея попробовать программно подключиться к моим 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
, с целевым устройством, или что я делаю неправильно?Я очень новичок в этом.Мой код кажется мне слишком расплывчатым, он вообще не учитывает мое подключенное устройство, но это единственное, что я могу найти в Интернете.Большое спасибо заранее.