问题描述
我已经创建了一个示例Wear OS应用程序,它应该可以发现BLE设备,但我的代码需要蓝牙许可。当我将这些行放入清单时:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
相应的权限不会显示在设置/应用程序/权限中,并且每个权限请求都不执行任何操作。顺便说一下,我的BLE设备(扬声器和ESP-32)也没有显示在设置/蓝牙中。
如何为我的应用程序授予蓝牙权限,或者如何将BLE设备连接到我的手表?
更新: 我尝试了这些:
if (checkSelfPermission(Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH), 1001)
}
if (checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_CONNECT), 1001)
}
if (checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_SCAN), 1001)
}
if (checkSelfPermission(Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_ADMIN), 1001)
}
但对话框窗口仍未显示
推荐答案
根据documentation,您需要基于目标Android API版本的特定权限。
如果您的应用面向Android 11(API级别30)或更低版本,请在应用的清单文件中声明以下权限:
蓝牙是执行任何蓝牙传统通信或BLE通信所必需的,例如请求连接、接受连接和传输数据。
Access_Fine_Location是必需的,因为在Android 11和更低版本上,蓝牙扫描可能用于收集有关用户位置的信息。
如果您的应用针对Android 9(API级别28)或更低版本,您可以声明ACCESS_COARSE_LOCATION
权限,而不是ACCESS_FINE_LOCATION
权限。
为了执行扫描以发现BLE设备,应用程序必须明确要求用户也在AndroidManifest.xml
中声明ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
权限。
在我的项目(WearOS API版本28)中,我在MainActivity
类的onCreate
函数中使用了此代码
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
1);
}
和我重写了onRequestPermissionsResult
函数
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case 1:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Logger.d("MainActivity","Permission approved");
} else {
Logger.d("MainActivity","Error getting permission");
}
return;
}
}
这对我很有用,希望能对您有所帮助
这篇关于无法在Wear OS Samsung Galaxy Watch 4上请求蓝牙权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!