Обнаружение устройства Bluetooth в Android - startDiscovery()
Цель: Создайте приложение Android, которое обнаруживает имена и адреса устройств BT в пределах диапазона и отправляет их значения в веб-службу. Устройства BT ранее не были привязаны к главному устройству, я просто хочу рассказать обо всем, когда я общаюсь.
Что я сделал:
- Портирование документации.
- Реализован локальный экземпляр адаптера BT хост-устройства.
- Внедрено уведомление для включения BT, если оно не включено.
- Зарегистрированные широковещательные приемники и намерения для синтаксического анализа
ACTION_FOUNDs
, выходящего из startDiscovery().
- Зарегистрировано BLUETOOTH и BLUETOOTH_ADMIN разрешения в манифесте.
Работает (как проверено с инкрементным ведением журнала) до startDiscovery()
.
Разочарование:
- startDiscovery(). Я подозреваю, что передаю это в неправильном контексте. В каком контексте этот метод должен быть включен для правильной работы?
Если вы смогли заставить этот метод работать, я очень благодарен за вашу мудрость.
UPDATE - здесь урезана упрощенная версия кода, которая вызывает у меня горе; это упрощение повторяет мою ошибку. Этот код работает, он не вызывает ошибок cat.log
или других ошибок, он просто не дает никакого вывода.
package aqu.bttest;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
public class BT2Activity extends Activity {
private BluetoothAdapter mBTA;
private SingBroadcastReceiver mReceiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//register local BT adapter
mBTA = BluetoothAdapter.getDefaultAdapter();
//check to see if there is BT on the Android device at all
if (mBTA == null){
int duration = Toast.LENGTH_SHORT;
Toast.makeText(this, "No Bluetooth on this handset", duration).show();
}
//let make the user enable BT if it isn't already
if (!mBTA.isEnabled()){
Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBT, 0xDEADBEEF);
}
//cancel any prior BT device discovery
if (mBTA.isDiscovering()){
mBTA.cancelDiscovery();
}
//re-start discovery
mBTA.startDiscovery();
//let make a broadcast receiver to register our things
mReceiver = new SingBroadcastReceiver();
IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, ifilter);
}
private class SingBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); //may need to chain this to a recognizing function
if (BluetoothDevice.ACTION_FOUND.equals(action)){
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a Toast
String derp = device.getName() + " - " + device.getAddress();
Toast.makeText(context, derp, Toast.LENGTH_LONG);
}
}
}
}
Ответы
Ответ 1
В каком контексте должен быть установлен этот метод для правильной работы.
Проще говоря, вы должны использовать startDiscovery()
, если вы хотите, чтобы ваше приложение обнаруживало локальные устройства Bluetooth... например, если вы хотите реализовать ListActivity
, который сканирует и динамически добавляет соседние устройства Bluetooth к ListView
(см. DeviceListActivity
).
Ваше использование метода startDiscovery()
должно выглядеть примерно так:
-
Определите переменную класса, представляющую локальный адаптер Bluetooth.
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
-
Убедитесь, что ваше устройство уже "обнаруживает". Если это так, отмените обнаружение.
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
-
Сразу после проверки (и, возможно, отмены) режима обнаружения, начните обнаружение, вызвав,
mBtAdapter.startDiscovery();
-
Будьте очень осторожны в целом о случайном выходе из устройства в режиме обнаружения. Выполнение обнаружения устройства - это тяжелая процедура для адаптера Bluetooth и потребляет много ресурсов. Например, вы хотите убедиться, что вы проверяете/отменяете обнаружение, прежде чем пытаться установить соединение. Вы, скорее всего, хотите отменить обнаружение в своем методе onDestroy
.
Сообщите мне, помогло ли это... и если у вас все еще есть проблемы, обновите свой ответ с помощью вывода logcat и/или любых сообщений об ошибках, которые вы получаете, и, возможно, я могу помочь вам немного больше.
Ответ 2
пожалуйста, проверьте этот код, это поможет много
https://github.com/manishkummar21/bluetoothscanning