【问题标题】:Prompted for Bluetooth PIN when connecting to already paired device on Android连接到 Android 上已配对的设备时提示输入蓝牙 PIN
【发布时间】:2010-10-01 13:51:02
【问题描述】:

我正在开发一个 Android 应用程序以连接到支持蓝牙串行端口配置文件 (SPP) 的简单设备。我能够成功连接和交换数据,但每次连接时都会提示用户输入设备的 PIN。

在蓝牙设置中,我可以看到设备“未连接配对”。

提示是一个问题,因为如果用户输入 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();
  }
 }

只要用户快速输入 PIN,连接成功,我可以接收数据。我的预感是我缺少一个设置步骤。不过,我对 BT 的细节不是很熟悉,所以我不确定这是否是设备强制输入 PIN 的问题?

【问题讨论】:

    标签: java android bluetooth serial-port


    【解决方案1】:

    这可能是远程设备没有保持设备绑定的问题(意味着存储要在后续连接中使用的链接密钥),这将导致每次重新配对并需要输入 PIN。 Android 通常应在配对成功后存储绑定信息。

    【讨论】:

    • 您能否尝试检查列表中是否已经存在绑定的设备 - 有时列表已满时可能会发生这种情况
    • 不幸的是,没有。该设备是条形码扫描仪。它的诊断非常有限。它会告诉我它被配置为读取什么条形码,但仅此而已。
    • 我的旧手机尝试连接到 BT 串行模块时遇到了这个问题。似乎这与 Android 在较低 API 版本上的 BT 实现有关(我已经尝试了 3-4 个其他 android 设备 - 都运行良好)。将尝试使用反射或使用其他 API 调用该方法,并告诉您我是否成功
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多