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

13

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

Что я сделал:

Pored over documentation. Implemented a local instance of the host device's BT adapter. Implemented a notification to enable BT if it isn't enabled. Registered Broadcast Receivers and Intents to parse the ACTION_FOUNDs coming off of startDiscovery(). Registered BLUETOOTH and BLUETOOTH_ADMIN permissions in the manifest.

Вещи работают (как проверено с добавочной регистрацией консоли) доstartDiscovery().


Frustration:

startDiscovery() -- I suspect I am passing this in the wrong context. What context does this method need to be placed within to function properly?

Если бы вы смогли использовать этот метод, я был бы очень признателен за вашу мудрость.

UPDATE - здесь упрощенная упрощенная версия кода, которая вызывает у меня горе; это упрощение повторяет мою ошибку. Этот код работает, он не выбрасываетcat.log ошибки или другие ошибки, он просто не дает никакого вывода.

<code>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);
        }
    }
}
</code>

}

Это помогло бы узнать ошибку, которую вы получаете ... или, по крайней мере, что именно заставляет вас верить, чтоstartDiscovery() работает неправильно. Alex Lockwood

Ваш Ответ

1   ответ
17

perly.

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

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

Define a class variable representing the local Bluetooth adapter.

BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

Check to see if your device is already "discovering". If it is, then cancel discovery.

if (mBtAdapter.isDiscovering()) {
    mBtAdapter.cancelDiscovery();
}

Immediately after checking (and possibly canceling) discovery-mode, start discovery by calling,

mBtAdapter.startDiscovery();

Be very careful in general about accidentally leaving your device in discovery-mode. Performing device discovery is a heavy procedure for the Bluetooth adapter and will consume a lot of its resources. For instance, you want to make sure you check/cancel discovery prior to attempting to make a connection. You most likely want to cancel discovery in your onDestroy method too.

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

Это помогло. Кроме того, передача результатов в ArrayAdapter вместо Toast определенно также помогла. Lemminkainen
Error: User Rate Limit Exceeded
@ Шуб, я так не думаю. Причина, по которой введено это ограничение, заключается в том, чтобы приложения не злоупотреблялиBluetooth непрерывно сканируя в фоновом режиме.
Error: User Rate Limit Exceededstackoverflow.com/questions/41987424/…

Похожие вопросы