Mus*_*ğlu 11 android bluetooth android-permissions android-bluetooth android-12
蓝牙是我们应用程序的主要依赖项。因此,我们已经尝试实施新的 Android 12 蓝牙权限。我们唯一的资源是Android 开发人员 Android 12 中的新蓝牙权限。只是说添加权限
“android.permission.BLUETOOTH_CONNECT”
“android.permission.BLUETOOTH_SCAN”
我添加并获得了两个和当然位置的运行时权限(通常为前 12))。
我的代码库中没有其他变化。应该?我不知道。所以,问题是我的应用程序找不到 BLE 设备。我找不到原因。
你有什么建议或资源吗?
Har*_*r S 64
100% 工作解决方案:不需要任何 3rd 方插件
清单代码:
<!--BLUETOOTH PERMISSION-->
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Needed only if your app looks for Bluetooth devices.
If your app doesn't use Bluetooth scan results to derive physical
location information, you can strongly assert that your app
doesn't derive physical location. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if your app makes the device discoverable to Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Needed only if your app communicates with already-paired Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!--bibo01 : hardware option-->
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
Run Code Online (Sandbox Code Playgroud)
Kotlin代码://检查android12+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
requestMultiplePermissions.launch(arrayOf(
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT))
}
else{
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
requestBluetooth.launch(enableBtIntent)
}
....................................................
private var requestBluetooth = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
//granted
}else{
//deny
}
}
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.d("test006", "${it.key} = ${it.value}")
}
}
Run Code Online (Sandbox Code Playgroud)
了解更多: https ://developer.android.com/guide/topics/connectivity/bluetooth/permissions
HAZ*_*NUS 19
这对我有用,
\n在清单中添加以下权限:
\n<uses-permission android:name="android.permission.BLUETOOTH" />\n<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />\n<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />\n<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />\n<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />\nRun Code Online (Sandbox Code Playgroud)\n然后,在执行蓝牙功能之前,\xc2\xa0检查权限:
\n//--------------------------Java--------------------------\nif (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) \n {\n if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) \n {\n ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 2);\n return;\n }\n }\n\n//--------------------------Kotlin--------------------------\nif (ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) \n {\n if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) \n {\n ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.BLUETOOTH_CONNECT), 2)\n return\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n举个例子,
\nif (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) {\n if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 2);\n return;\n }\n }\n mBTSocket.connect();\nRun Code Online (Sandbox Code Playgroud)\n
Pes*_*esa 10
我刚刚添加到清单中:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
Run Code Online (Sandbox Code Playgroud)
然后我像其他任何人一样向主要活动请求这些权限。为了请求许可,我正在使用图书馆
implementation 'pub.devrel:easypermissions:3.0.0'
Run Code Online (Sandbox Code Playgroud)
那么你可以调用这个函数
public static final String[] BLUETOOTH_PERMISSIONS_S = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT} ;
Run Code Online (Sandbox Code Playgroud)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!EasyPermissions.hasPermissions(this, BLUETOOTH_PERMISSIONS_S)) {
EasyPermissions.requestPermissions(this, message, yourRequestCode,BLUETOOTH_PERMISSIONS_S);
}
}
Run Code Online (Sandbox Code Playgroud)
并覆盖 onRequestPermissionResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
Run Code Online (Sandbox Code Playgroud)
Jetpack Compose 更新
如果您使用jetpack compose,您可以这样处理:
在 RememberMultiplePermissionState 函数中创建您的权限列表
rememberMultiplePermissionsState(
permissions = listOf(
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN
)
)
Run Code Online (Sandbox Code Playgroud)
然后观察生命周期事件和恢复启动权限请求
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(key1 = lifecycleOwner,
effect = {
val observer = LifecycleEventObserver { _, event ->
if(event == Lifecycle.Event.ON_START) {
permissionsState.launchMultiplePermissionRequest()
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
})
Run Code Online (Sandbox Code Playgroud)
观察权限状态
permissionsState.permissions.forEach { permissionState ->
when(permissionState.permission) {
Manifest.permission.ACCESS_FINE_LOCATION -> {
when {
permissionState.hasPermission -> {}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Android 12 和 Android 13 会发生这种情况。添加新权限无法解决我的情况:我已为蓝牙和 WiFi 设置了所有相关权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
android:usesPermissionFlags="neverForLocation" />
Run Code Online (Sandbox Code Playgroud)
手动解决方案(已添加屏幕截图):转到应用程序的设置并单击权限。您将看到允许和拒绝(不允许)权限。“不允许”权限列表中会有“附近设备”权限。允许这一点,应用程序将在 Android 12 和 Android 13 中正常运行,无需任何问题。

| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |