gpt4 book ai didi

Android - 蓝牙发现未找到任何设备

转载 作者:IT王子 更新时间:2023-10-29 00:04:42 26 4
gpt4 key购买 nike

我目前正在开发一个小应用程序,以开始使用蓝牙 Android API 可以提供的服务。

编辑 -> 答案:

问题似乎是由特定的 Nexus 5 设备引起的。好像他们的蓝牙接收器不能正常工作。下面的解决方案应该适用于其他设备

备注:

  1. 我在这里阅读了文档:http://developer.android.com/guide/topics/connectivity/bluetooth.html以及本教程的以下源代码http://www.londatiga.net/it/programming/android/how-to-programmatically-scan-or-discover-android-bluetooth-device/位于/lorensiuswlt/AndroBluetooth 下的 github

  2. 我已经完成了几乎所有我感兴趣的功能(例如检查适配器是否存在、启用/禁用蓝牙、查询配对设备、设置适配器可发现)。

问题:

实际上,当我启动 .onDiscovery() 方法时找不到设备,即使从我的 Nexus 5 上的设置/蓝牙中找到设备。

我是这样处理的:

public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

...

protected void onCreate(Bundle savedInstanceState) {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter);
}

过滤器运行良好,我可以尝试,即 ACTION_STATE_CHANGED(启用蓝牙)和两个 ACTION_DISCOVERY_***。

然后成功调用以下方法:

public void onDiscovery(View view)
{
mBluetoothAdapter.startDiscovery();
}

然后我有我的蓝牙接收器:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

if (state == BluetoothAdapter.STATE_ON) {
showToast("ACTION_STATE_CHANGED: STATE_ON");
}
}

else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
mDeviceList = new ArrayList<>();
showToast("ACTION_DISCOVERY_STARTED");
mProgressDlg.show();
}

else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action) && !bluetoothSwitchedOFF) {
mProgressDlg.dismiss();
showToast("ACTION_DISCOVERY_FINISHED");

Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class);

newIntent.putParcelableArrayListExtra("device.list", mDeviceList);

startActivity(newIntent);
}

else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// When discovery finds a device
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mDeviceList.add(device);
showToast("Device found = " + device.getName());
}
}
};

我在 logcat 中没有任何问题,并且在我进行的测试期间没有发现任何问题。唯一的问题是在扫描结束时没有发现任何设备,此时周围有许多可发现的设备。

为了不让话题泛滥,我尽量不放太多代码。如果您需要更多,请询问我。

感谢您阅读我的内容,并提前感谢您的回答。

最佳答案

您在哪个版本的 Android 上运行此程序?如果是 Android 6.x,我相信你需要在你的 manifest 中添加 ACCESS_FINE_LOCATION 权限。例如:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

我遇到了类似的问题,这为我解决了。

更新: 添加 documentation direct from Google对此:

To access the hardware identifiers of nearby external devices via Bluetooth and Wi-Fi scans, your app must now have the ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permissions

2020 年更新:我们最近更新了我们的应用程序以面向 SDK 版本 29。在此过程中,我们的应用程序无法再次发现蓝牙设备。自从最初编写此答案以来,我们一直在使用 ACCESS_COARSE_LOCATION。更改为 ACCESS_FINE_LOCATION 似乎可以解决问题。如果目标是 29 岁以上,我现在建议开发人员尝试 ACCESS_FINE_LOCATION。已更新答案以反射(reflect)这一点。

关于Android - 蓝牙发现未找到任何设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34966133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com