Обнаружение устройств Bluetooth в Android - startDiscovery()

цель: создайте приложение для Android, которое обнаруживает имена и адреса устройств BT в пределах диапазона и отправляет их значения в веб-сервис. Устройства BT ранее не были связаны с хост-устройством, я просто хочу опросить все, когда я хожу.

что я сделал:

  1. углубился в документацию.
  2. реализован локальный экземпляр адаптера BT хост-устройства.
  3. реализовано уведомление для включения BT если он не включен.
  4. зарегистрированные приемники вещания и намерения разобрать ACTION_FOUNDs С startDiscovery().
  5. зарегистрированы 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() метод должен выглядеть примерно так это:

  1. определите переменную класса, представляющую локальный адаптер Bluetooth.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    
  2. проверьте, если ваше устройство уже "открывали". Если это так, отмените обнаружение.

    if (mBtAdapter.isDiscovering()) {
        mBtAdapter.cancelDiscovery();
    }
    
  3. сразу после проверки (и, возможно, отмены) режима обнаружения, начните обнаружение, позвонив,

    mBtAdapter.startDiscovery();
    
  4. будьте очень осторожны в целом о случайно оставив свой устройство в режиме обнаружения. Выполнение обнаружения устройства является тяжелой процедурой для адаптера Bluetooth и будет потреблять много ресурсов. Например, вы хотите убедиться, что вы проверяете / отменяете обнаружение перед попыткой установить соединение. Скорее всего, вы хотите отменить обнаружение в своем onDestroy метод слишком.

Дайте мне знать, если это помогло... и если у вас все еще есть проблемы, обновите свой ответ с выходом logcat и / или любыми сообщениями об ошибках, которые вы и, возможно, я смогу помочь тебе немного больше.