Android中的蓝牙设备发现 - startDiscovery()

时间:2012-05-12 01:22:45

标签: android android-intent bluetooth android-adapter android-context

目标:构建一个Android应用,发现范围内BT设备的名称和地址,并将其值提交给网络服务。以前没有将BT设备绑定到主机设备上,我只想在我走动时查看所有内容。

我做了什么:

  1. 仔细阅读文档。
  2. 实施了主机设备的BT适配器的本地实例。
  3. 如果没有启用BT,则实施通知以启用BT。
  4. 已注册的广播接收者和意图来解析 startDiscovery()ACTION_FOUNDs
  5. 在清单中注册了 BLUETOOTH BLUETOOTH_ADMIN 权限。
  6. 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 个答案:

答案 0 :(得分:17)

  

需要将此方法置于何种上下文才能正常运行。

简单地说,当您希望应用程序发现本地蓝牙设备时,您应该使用startDiscovery() ...例如,如果您想实施扫描并动态添加附近蓝牙的ListActivity设备为ListView(请参阅DeviceListActivity)。

您对startDiscovery()方法的使用应如下所示:

  1. 定义表示本地蓝牙适配器的类变量。

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    
  2. 检查您的设备是否已“发现”。如果是,则取消发现。

    if (mBtAdapter.isDiscovering()) {
        mBtAdapter.cancelDiscovery();
    }
    
  3. 在检查(并可能取消)发现模式后,立即通过调用

    开始发现
    mBtAdapter.startDiscovery();
    
  4. 一般要非常小心,不小心将设备置于发现模式。执行设备发现对于蓝牙适配器来说是一个繁重的过程,并且会消耗大量资源。例如,您要确保在尝试建立连接之前检查/取消发现。您很可能也希望在onDestroy方法中取消发现。

  5. 如果这有帮助,请告诉我...如果您仍然遇到问题,请使用您的logcat输出和/或您收到的任何错误消息更新您的答案,也许我可以帮助您更多。