Запрашивается PIN-код Bluetooth при подключении к уже подключенному устройству на Android - PullRequest
1 голос
/ 01 октября 2010

Я разрабатываю приложение для Android для подключения к простому устройству, которое поддерживает профиль последовательного порта Bluetooth (SPP).Я могу успешно подключаться и обмениваться данными, но каждый раз, когда я подключаюсь, пользователю предлагается ввести PIN-код для устройства.

В настройках Bluetooth я вижу, что устройство «сопряжено с неподключенным»,

Подсказка является проблемой, потому что если пользователь недостаточно быстро вводит PIN-код, время подключения сокета истекает, и пользователь должен повторить попытку.

Соответствующие биты кода ниже ...

@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);
  setContentView(R.layout.scanlayout);
  ...  
  _Context = this;
  _ActivityCreated = true;
  _ReceivedText = (TextView)findViewById(R.id._Scan_Results);
  _BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  _BluetoothDevice = _BluetoothAdapter.getRemoteDevice(_DeviceAddress);
  _BusySpinner = ProgressDialog.show(_Context, "", "Connecting to scanner...");
  new ConnectToScannerTask().execute(_BluetoothDevice);
}
private final Handler scanReceivedHandler = new Handler() 
{
 @Override
 public void handleMessage(Message message) 
 {
  String receivedText = (String)message.obj;
  _ReceivedText.setText(receivedText);
 }
};

private class ConnectToScannerTask extends AsyncTask<BluetoothDevice, Void, InputStream>
{
 @Override
 protected InputStream doInBackground(BluetoothDevice... params)
 {
  BluetoothDevice device = params[0];
  try
  {
   _Socket = device.createRfcommSocketToServiceRecord(WELL_KNOWN_UUID);
   _BluetoothAdapter.cancelDiscovery();
   _Socket.connect();
   return _Socket.getInputStream();
  }
  catch (IOException e)
  {
   Log.d("ScanActivity.ConnectToScannerTask.doInBackground", e.getMessage());
  }
  return null;
 }

 @Override
 protected void onPostExecute(final InputStream result)
 {
  _BusySpinner.dismiss();

  if (result == null)
  {
   _ReceivedText.setText("Failed to connect to scanner.");
   return;
  }

      Thread thread = new Thread()
      {
       @Override
       public void run() 
       {
        byte[] buffer = new byte[1024];
     try
     {
      while (_ActivityCreated)
      {
       Arrays.fill(buffer, (byte) 0);
       int bytesRead = result.read(buffer);
       if (bytesRead > 0)
       {
        Message message = scanReceivedHandler.obtainMessage(1, new String(buffer));
        message.sendToTarget();
        Log.e("ScanActivity", "Received: " + new String(buffer));
       }
       if (bytesRead < 0)
       {
        break;
       }
      }
      Message message = scanReceivedHandler.obtainMessage(1, "End of Stream");
      message.sendToTarget();
      Log.e("ScanActivity", "End of Stream");
     }
     catch (Exception e)
     {
      Message message = scanReceivedHandler.obtainMessage(1, "Connection to scanner lost");
      message.sendToTarget();
      Log.e("ScanActivity", e.getMessage());
     }
     try
     {
      _Socket.close();
     }
     catch (IOException e)
     {
      Log.e("ScanActivity", e.getMessage());
     }
       }
      };
      thread.start();
  }
 }

Пока пользователь быстро вводит ПИН-код, подключение успешно выполняется, и я могу получать данные.Я догадываюсь, что мне не хватает шага настройки.Я не настолько знаком со спецификой BT, поэтому не уверен, что это может быть причиной того, что устройство принудительно вводит PIN-код?

1 Ответ

1 голос
/ 17 марта 2011

Это может быть проблемой с удаленным устройством, которое не сохраняет устройство подключенным (то есть хранить ключ связи, который будет использоваться при последующем подключении), что приведет к повторному сопряжению каждый раз и потребует ввода PIN-кода.Android обычно должен хранить информацию о связывании после успешного сопряжения.

...