Подтвердить что ты не робот

Обнаружение устройства 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);
        }
    }
}

}

4b9b3361

Ответ 1

В каком контексте должен быть установлен этот метод для правильной работы.

Проще говоря, вы должны использовать startDiscovery(), если вы хотите, чтобы ваше приложение обнаруживало локальные устройства Bluetooth... например, если вы хотите реализовать ListActivity, который сканирует и динамически добавляет соседние устройства Bluetooth к ListView (см. DeviceListActivity).

Ваше использование метода startDiscovery() должно выглядеть примерно так:

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

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

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

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

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