gpt4 book ai didi

android - Oreo,带有 PendingIntent 的 BLE 扫描仪 startScan 在三星设备上不工作

转载 作者:行者123 更新时间:2023-11-29 23:57:06 37 4
gpt4 key购买 nike

我正在尝试使用 startScan(filters, settings, callbackIntent) 扫描信标.我有一个适用于 Sony Xperia XZ 和 Nexus 5X 的实现。我唯一可用的其他配备 Android O 的设备是三星 Galaxy S8,适用于其他设备的设备在三星上没有任何效果。 (蓝牙扫描实际上嵌入在库模块中,但即使在创建虚拟应用程序时三星也会失败,因此我将在本例中使用它)。我已经删除了用于 startScan 的过滤器和设置,因为无论如何扫描都无法正常工作,而且这些都是可选的。

MainActivity
- checks and asks for permissions (ACCESS_COARSE_LOCATION)
- simplified onStart

override fun onStart() {
super.onStart()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val startScan = bleScanner.startScan(null, null, getPendingIntent())
Log.d("testApp", "Start scan! ${startScan == 0}")
}
}

PendingIntent:

private fun getPendingIntent(): PendingIntent {
return PendingIntent.getBroadcast(
this, REQ_CODE,
Intent(this.applicationContext, BleReceiver::class.java),
PendingIntent.FLAG_UPDATE_CURRENT)
}

list

权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

接收者:

    <receiver android:name="com.testapp.samsungoscan.BleReceiver" >
<intent-filter>
<action android:name="BluetoothDevice.ACTION_FOUND" />
<action android:name="BluetoothDevice.EXTRA_UUID" />
<action android:name="BluetoothDevice.EXTRA_RSSI" />
</intent-filter>
</receiver>

接收器实现:

class BleReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.e("testApp", "On Receive!")
}
}

所以!为什么这不适用于三星,而适用于索尼和 Nexus?注意:如果我将接收器 android:name 更改为相对路径 .BleReceiver 而不是 com.testapp.samsungoscan.BleReceiver,那么 Nexus停止工作,但索尼仍在工作!

我所说的工作是指所有类都被使用并且日志被触发。怎么了?

最佳答案

您已经在 AndroidManifest.xml 中使用 Intent Filter 名称注册了广播接收器

<action android:name="BluetoothDevice.ACTION_FOUND" />

首先,您可以在那里提供任何字符串。以上建议您使用this constant ,但实际上您只是按原样使用 String ( BluetoothDevice.ACTION_FOUND )。我建议将其更改为一些 com.testapp.samsungoscan.ACTION_FOUND . Extras 不是必需的,他们暗示它们实际上是 extras,但它们只是另一个名称为“extra”的 Action 名称。

我建议更改为:

<receiver android:name="com.testapp.samsungoscan.BleReceiver">
<intent-filter>
<action android:name="com.testapp.samsungoscan.ACTION_FOUND" />
</intent-filter>
</receiver>

其次,您必须使用此操作名称创建 PendingIntent:

private fun getPendingIntent(): PendingIntent {
return PendingIntent.getBroadcast(
this, REQ_CODE,
Intent(this.applicationContext, BleReceiver::class.java).setAction("com.testapp.samsungoscan.ACTION_FOUND"),
PendingIntent.FLAG_UPDATE_CURRENT)
}

创建一个提供组件名称的 Intent 是必需的,因为奥利奥能够获得任何广播。但是,我不确定在您的应用程序被系统杀死后它是否还能正常工作。

最后,我建议请求 FINE_LOCATION,如下所示:https://android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/848935将来更改可能需要精细位置权限才能扫描蓝牙设备。

关于android - Oreo,带有 PendingIntent 的 BLE 扫描仪 startScan 在三星设备上不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248178/

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