我有两个应用程序,它们的代码库非常相似,在移动设备(Android 13 / API 33)和穿戴设备(Android 11 / API级别30)上运行良好,使用旧式蓝牙连接程序。 当尝试在 Playstore 上发布时,我被要求重新设计此过程以使用 CompanionDeviceManager 来减少请求的权限数量。移动应用程序的返工相当简单,该应用程序与 CompanionDeviceManager 再次正常工作。 不过,穿戴应用程序给我带来了相当困难,CompanionDeviceManager 蓝牙对话框不显示。
我一直在浏览、阅读和尝试,但我尝试过的所有代码和权限组合都以 CompanionDeviceManager.associate 调用 checkFeaturePresent 结束,尽管相应的权限是,但它返回 false 并带有调试输出“Feature PackageManager.FEATURE_COMPANION_DEVICE_SETUP 不可用”添加到清单文件中。 taget 设备是 Fossil Gen 6 智能手表。 我需要连接的设备是 BLE 设备,但我认为这并不重要。
我在这里有点绝望,所以非常感谢任何指点!
清单中的权限(并非所有这些都是必需的):
<uses-feature
android:name="android.hardware.type.watch"
android:required="true" />
<uses-feature
android:name="android.software.companion_device_setup"
android:required="true" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
应该触发 CompanionDeviceManager 对话的 Activity 代码:
@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ble_bond_cdm_activity)
val deviceFilter: BluetoothLeDeviceFilter = BluetoothLeDeviceFilter.Builder()
.setNamePattern(Pattern.compile("${MainActivity.productName}_\\d+"))
.build()
val pairingRequest: AssociationRequest = AssociationRequest.Builder()
.addDeviceFilter(deviceFilter)
.setSingleDevice(false)
.build()
deviceManager.associate(
pairingRequest,
object : CompanionDeviceManager.Callback() {
override fun onDeviceFound(chooserLauncher: IntentSender) {
startIntentSenderForResult(
chooserLauncher,
SELECT_DEVICE_REQUEST_CODE,
null,
0,
0,
0
)
}
override fun onFailure(error: CharSequence?) {
MainActivity.setSensorDevice(null)
}
}, null
)
} // onCreate
@SuppressLint("MissingPermission")
override fun onActivityResult(
requestCode: Int,
resultCode: Int,
data: Intent?
) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
SELECT_DEVICE_REQUEST_CODE -> {
when (resultCode) {
Activity.RESULT_OK -> {
val scanResult: ScanResult? = data?.getParcelableExtra(
CompanionDeviceManager.EXTRA_DEVICE
)
// The user chose to pair the app with a Bluetooth device.
if (scanResult != null) {
MainActivity.setSensorDevice(scanResult.device)
} else {
MainActivity.setSensorDevice(null)
}
}
else -> {
MainActivity.setSensorDevice(null)
}
}
}
else -> {
MainActivity.setSensorDevice(null)
}
}
finish()
} // onActivityResult
您的第三方穿戴应用不应该调用 CompanionDeviceManager.associate,调用将会失败,并且不会提示 UI 对话框,因为 WearOS 上不存在 CompanionDeviceManager UI 包。
此外,3p 应用程序根本不需要在您的手表上创建关联。通常只有配套应用程序(例如 Fossil Gen 6 配套应用程序)需要使用 CompanionDeviceManager。