目标:构建一个 Android 应用程序,用于发现范围内的 BT 设备的名称和地址,并将它们的值提交给网络服务。 BT 设备以前没有绑定(bind)到主机设备,我只是想边走边轮询所有内容。
我做了什么:
- 仔细阅读文档。
- 实现了主机设备的 BT 适配器的本地实例。
- 实现通知以在未启用 BT 时启用它。
- 注册广播接收器和解析
ACTION_FOUNDs
来自 startDiscovery() 的 Intent 。 - 在 list 中注册了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);
}
}
}
最佳答案
What context does this method need to be placed within to function properly.
简单来说,当您希望您的应用程序发现本地蓝牙设备时,您应该使用startDiscovery()
...例如,如果您想要实现一个ListActivity
扫描附近的蓝牙设备并将其动态添加到 ListView
(参见 DeviceListActivity
)。
startDiscovery()
方法的用法应如下所示:
定义一个代表本地蓝牙适配器的类变量。
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
检查您的设备是否已经在“发现”。如果是,则取消发现。
if (mBtAdapter.isDiscovering()) { mBtAdapter.cancelDiscovery(); }
检查(并可能取消)发现模式后,立即通过调用开始发现,
mBtAdapter.startDiscovery();
通常要非常小心,不要意外地将您的设备置于发现模式。执行设备发现对于蓝牙适配器来说是一个繁重的过程,并且会消耗它的大量资源。例如,您要确保在尝试建立连接之前检查/取消发现。您很可能也想在
onDestroy
方法中取消发现。
让我知道这是否有帮助...如果您仍然遇到问题,请使用您的 logcat 输出和/或您收到的任何错误消息更新您的答案,也许我可以为您提供更多帮助。
关于android - Android 中的蓝牙设备发现 -- startDiscovery(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560319/