Je développe une application Android pour me connecter à un périphérique simple qui prend en charge le profil de port série Bluetooth (SPP). Je suis en mesure de se connecter et d'échanger des données, mais chaque fois que je me connecte l'utilisateur est invité à entrer le code PIN de l'appareil. Dans les paramètres Bluetooth, je peux voir que l'appareil est "couplé par non connecté".J'ai demandé le code PIN Bluetooth lors de la connexion à un appareil déjà couplé sur Android
L'invite est un problème car si l'utilisateur ne saisit pas assez rapidement le code PIN, la connexion de la session expire et l'utilisateur doit réessayer.
Bits importants de code ci-dessous ...
@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();
}
}
Tant que l'utilisateur est rapide à entrer dans le code PIN, la connexion et je peux réussit recevoir des données. Mon intuition est que je manque une étape de configuration. Cependant, je ne suis pas familier avec les spécificités de BT, donc je ne suis pas sûr que cela puisse être un problème où l'appareil force le code PIN à être entré?
Y a-t-il des solutions de rechange si c'est le cas? – JadeMason
Pouvez-vous essayer de vérifier s'il y a déjà des périphériques collés dans la liste - parfois cela peut arriver quand la liste est pleine –
Malheureusement, non. L'appareil est un scanner de codes à barres. Il a des diagnostics assez limités. Il me dira quel (s) code (s) il est configuré pour lire, mais c'est à peu près tout. – JadeMason