Обнаружение устройств Bluetooth в Android - startDiscovery()
цель: создайте приложение для Android, которое обнаруживает имена и адреса устройств BT в пределах диапазона и отправляет их значения в веб-сервис. Устройства BT ранее не были связаны с хост-устройством, я просто хочу опросить все, когда я хожу.
что я сделал:
- углубился в документацию.
- реализован локальный экземпляр адаптера BT хост-устройства.
- реализовано уведомление для включения BT если он не включен.
- зарегистрированные приемники вещания и намерения разобрать
ACTION_FOUNDs
С startDiscovery(). - зарегистрированы BLUETOOTH и BLUETOOTH_ADMIN разрешения в манифесте.
вещи работают (как проверено с инкрементным журналированием консоли) до startDiscovery()
.
разочарование:
- startDiscovery() -- Я подозреваю, что я передаю это в неправильном контексте. В каком контексте этот метод должен быть помещен для правильной работы?
если вы смогли заставить этот метод работать, я был бы очень признателен за вашу мудрость.
обновление - вот урезанная упрощенная версия кода, которая вызывает у меня горе; это упрощение повторяет мою ошибку. Этот код запускается, он не бросает 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's 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's 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 и / или любыми сообщениями об ошибках, которые вы и, возможно, я смогу помочь тебе немного больше.