无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限
Cannot request Bluetooth permission on Wear OS Samsung Galaxy Watch 4
我创建了一个示例 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" />
在settings/apps/permissions中没有显示相应的权限,每次权限请求都没有任何作用。顺便说一句,我的 BLE 设备(一个扬声器和一个 esp-32)也没有在 settings/Bluetooth 中显示。
如何为我的应用授予蓝牙权限或如何将 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)
}
但是对话框windows仍然没有显示
有一些权限,如相机、蓝牙,需要先询问,然后手动提供。在您的应用中最先加载的 activity 中使用它。
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.CAMERA), 1001);
} //ask camera permissions
确保进行必要的更改。
根据 documentation,您需要基于目标 Android API 版本的特定权限。
如果您的应用面向 Android11(API 级别 30) 或更低,请在您应用的清单文件中声明以下权限:
BLUETOOTH 是执行任何蓝牙 classic 或 BLE 通信所必需的,例如请求连接、接受连接和传输数据.
ACCESS_FINE_LOCATION 是必要的,因为在 Android 11 及更低版本上,蓝牙扫描可能用于收集有关信息用户的位置。
如果您的应用面向 Android 9(API 级别 28)或更低,您可以声明 ACCESS_COARSE_LOCATION
权限而不是 ACCESS_FINE_LOCATION
权限。
为了执行扫描以发现 BLE 设备,应用程序必须向用户明确要求 ACCESS_FINE_LOCATION
或 ACCESS_COARSE_LOCATION
权限,并且还要在 AndroidManifest.xml
中声明。
在我的项目(WearOS API 版本 28)中,我在 MainActivity
class
的 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 应用程序,它应该可以发现 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" />
在settings/apps/permissions中没有显示相应的权限,每次权限请求都没有任何作用。顺便说一句,我的 BLE 设备(一个扬声器和一个 esp-32)也没有在 settings/Bluetooth 中显示。
如何为我的应用授予蓝牙权限或如何将 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)
}
但是对话框windows仍然没有显示
有一些权限,如相机、蓝牙,需要先询问,然后手动提供。在您的应用中最先加载的 activity 中使用它。
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf<String>(Manifest.permission.CAMERA), 1001);
} //ask camera permissions
确保进行必要的更改。
根据 documentation,您需要基于目标 Android API 版本的特定权限。
如果您的应用面向 Android11(API 级别 30) 或更低,请在您应用的清单文件中声明以下权限:
BLUETOOTH 是执行任何蓝牙 classic 或 BLE 通信所必需的,例如请求连接、接受连接和传输数据.
ACCESS_FINE_LOCATION 是必要的,因为在 Android 11 及更低版本上,蓝牙扫描可能用于收集有关信息用户的位置。
如果您的应用面向 Android 9(API 级别 28)或更低,您可以声明 ACCESS_COARSE_LOCATION
权限而不是 ACCESS_FINE_LOCATION
权限。
为了执行扫描以发现 BLE 设备,应用程序必须向用户明确要求 ACCESS_FINE_LOCATION
或 ACCESS_COARSE_LOCATION
权限,并且还要在 AndroidManifest.xml
中声明。
在我的项目(WearOS API 版本 28)中,我在 MainActivity
class
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;
}
}
这对我有用,希望对你有所帮助