找回密码
 立即注册
首页 业界区 安全 Android开发 Jetpack_Compose 申请动态权限

Android开发 Jetpack_Compose 申请动态权限

殳世英 2025-11-28 10:10:04
前言

  在使用Jetpack Compose开发UI的时候,已经不能用以前在activity的方式申请动态权限了。 甚至连申请权限的思维也不太一样。虽然现在也可以直接申请动态权限。但是,现在的申请动态权限的规范是先要弹出一个弹窗告知用户权限的使用目的,然后再去申请这个权限。所以在Jetpack Compose申请权限最好是跟申请目的对话框捆绑在一起。 这个博客提供申请蓝牙Ble相关权限与相机权限作为参考。 
 
申请蓝牙权限
  1. import android.Manifest
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.content.pm.PackageManager
  5. import android.os.Build
  6. import androidx.activity.compose.rememberLauncherForActivityResult
  7. import androidx.activity.result.contract.ActivityResultContracts
  8. import androidx.compose.foundation.layout.Arrangement
  9. import androidx.compose.foundation.layout.Column
  10. import androidx.compose.foundation.layout.Row
  11. import androidx.compose.foundation.layout.Spacer
  12. import androidx.compose.foundation.layout.fillMaxWidth
  13. import androidx.compose.foundation.layout.height
  14. import androidx.compose.foundation.layout.padding
  15. import androidx.compose.foundation.layout.width
  16. import androidx.compose.material3.Button
  17. import androidx.compose.material3.ButtonDefaults
  18. import androidx.compose.material3.Card
  19. import androidx.compose.material3.CardDefaults
  20. import androidx.compose.material3.MaterialTheme
  21. import androidx.compose.material3.Text
  22. import androidx.compose.runtime.Composable
  23. import androidx.compose.runtime.mutableStateListOf
  24. import androidx.compose.runtime.mutableStateOf
  25. import androidx.compose.runtime.remember
  26. import androidx.compose.ui.Alignment
  27. import androidx.compose.ui.Modifier
  28. import androidx.compose.ui.graphics.Color
  29. import androidx.compose.ui.platform.LocalContext
  30. import androidx.compose.ui.unit.dp
  31. import androidx.compose.ui.unit.sp
  32. import androidx.compose.ui.window.Dialog
  33. import androidx.core.app.ActivityCompat
  34. import androidx.core.content.ContextCompat
  35. import com.yak.bleSdk.log.logE
  36. private val bluetoothPermissions by lazy {
  37.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
  38.         arrayOf(
  39.             Manifest.permission.BLUETOOTH_SCAN,
  40.             Manifest.permission.BLUETOOTH_CONNECT,
  41.             Manifest.permission.ACCESS_FINE_LOCATION // 某些情况仍需要
  42.         )
  43.     } else {
  44.         arrayOf(
  45.             Manifest.permission.BLUETOOTH,
  46.             Manifest.permission.BLUETOOTH_ADMIN,
  47.             Manifest.permission.ACCESS_FINE_LOCATION
  48.         )
  49.     }
  50. }
  51. /**
  52. * 检查蓝牙权限
  53. */
  54. fun checkBluetoothPermissions(context: Context): Boolean {
  55.     // 检查是否已拥有所有权限
  56.     val hasAllPermissions = bluetoothPermissions.all { permission ->
  57.         ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
  58.     }
  59.     return hasAllPermissions
  60. }
  61. /**
  62. * 请求蓝牙权限
  63. * @param isRequest 是否请求权限, 这个布尔值可以用来控制申请权限的时机比如按下某个按钮后申请权限,如果不需要选择时机,可以默认为ture
  64. *  如果需要控制申请时机,请参考:
  65. *  ```kotlin
  66. *     val isRequestBluetoothPermissions = remember { mutableStateOf(false) }
  67. *     RequestBluetoothPermissions(
  68. *         isRequest = isRequestBluetoothPermissions.value,
  69. *         agree = {
  70. *             // 用户同意权限后的操作
  71. *         },
  72. *         refuse = {
  73. *             // 用户拒绝权限后的操作
  74. *         }
  75. *     )
  76. *     Button(
  77. *             onClick = {
  78. *                 if(!checkBluetoothPermissions(context)){
  79. *                     isRequestBluetoothPermissions.value = true
  80. *                 }
  81. *             },
  82. *         ) {
  83. *             Text("点击申请权限", modifier = Modifier.padding(8.dp))
  84. *     }
  85. * ```
  86. * @param agree 同意
  87. * @param refuse 拒绝
  88. */
  89. @Composable
  90. fun RequestBluetoothPermissions(isRequest: Boolean = true, agree: () -> Unit, refuse: () -> Unit) {
  91.     if (!isRequest) {
  92.         return
  93.     }
  94.     val context = LocalContext.current
  95.     val activity = LocalContext.current as Activity
  96.     val allPermissionsGranted = remember { mutableStateOf(false) }
  97.     // 记录被永久拒绝的权限列表
  98.     val permanentlyDeniedPermissions = remember { mutableStateListOf<String>() }
  99.     val permissionLauncher = rememberLauncherForActivityResult(
  100.         ActivityResultContracts.RequestMultiplePermissions()
  101.     ) { permissionsMap ->
  102.         allPermissionsGranted.value = permissionsMap.values.all { it }
  103.         if (allPermissionsGranted.value) {
  104.             // 所有权限都已授予
  105.             "所有权限都已授予".logE()
  106.             agree.invoke()
  107.         } else {
  108.             // 处理权限被拒绝的情况
  109.             "处理权限被拒绝的情况".logE()
  110.             refuse.invoke()
  111.             // 遍历结果,找出被拒绝的权限,并判断是否为永久拒绝
  112.             permissionsMap.entries.forEach { entry ->
  113.                 val permission = entry.key
  114.                 val isGranted = entry.value
  115.                 if (!isGranted) {
  116.                     // 关键判断:检查该权限是否被永久拒绝
  117.                     if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
  118.                         "有权限被永久拒绝".logE()
  119.                         permanentlyDeniedPermissions.add(permission)
  120.                     }
  121.                 }
  122.             }
  123.         }
  124.     }
  125.     val isShowRefusePermissionDialog = remember { mutableStateOf(true) }
  126.     // 如果有权限被永久拒绝,可以在这里提示用户前往应用设置页手动开启
  127.     if (permanentlyDeniedPermissions.isNotEmpty() && isShowRefusePermissionDialog.value) {
  128.         // 例如,显示一个对话框引导用户去设置
  129.         Dialog(onDismissRequest = {
  130.             isShowRefusePermissionDialog.value = false
  131.             refuse.invoke()
  132.         }) {
  133.             // 自定义对话框内容
  134.             Card(
  135.                 colors = CardDefaults.cardColors(
  136.                     containerColor = Color.White,           // 默认状态
  137.                     disabledContainerColor = Color.LightGray // 禁用状态
  138.                 )
  139.             ) {
  140.                 Column(
  141.                     modifier = Modifier.padding(20.dp),
  142.                     horizontalAlignment = Alignment.CenterHorizontally
  143.                 ) {
  144.                     Text(
  145.                         text = "温馨提示",
  146.                         fontSize = 18.sp,
  147.                         modifier = Modifier.padding(bottom = 18.dp)
  148.                     )
  149.                     Spacer(modifier = Modifier.height(10.dp))
  150.                     Text(
  151.                         text = "需要蓝牙权限来扫描和连接附近的设备,但是权限被拒绝,请前往设置页面手动开启",
  152.                         fontSize = 16.sp,
  153.                         modifier = Modifier.padding(bottom = 16.dp)
  154.                     )
  155.                     Spacer(modifier = Modifier.height(10.dp))
  156.                     Row(
  157.                         modifier = Modifier.fillMaxWidth(),
  158.                         horizontalArrangement = Arrangement.Center
  159.                     ) {
  160.                         Button(
  161.                             modifier = Modifier.weight(1f),
  162.                             onClick = {
  163.                                 isShowRefusePermissionDialog.value = false
  164.                                 // 跳转到应用设置页面
  165.                                 val intent = android.content.Intent(
  166.                                     android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
  167.                                     android.net.Uri.parse("package:${context.packageName}")
  168.                                 )
  169.                                 context.startActivity(intent)
  170.                             }) {
  171.                             Text("知道了", color = MaterialTheme.colorScheme.onPrimary)
  172.                         }
  173.                     }
  174.                 }
  175.             }
  176.         }
  177.         return
  178.     }
  179.     // 检查是否已拥有所有权限
  180.     val hasAllPermissions = remember(bluetoothPermissions) {
  181.         bluetoothPermissions.all { permission ->
  182.             ContextCompat.checkSelfPermission(
  183.                 context,
  184.                 permission
  185.             ) == PackageManager.PERMISSION_GRANTED
  186.         }
  187.     }
  188.     val isShowDialog = remember { mutableStateOf(true) }
  189.     if (hasAllPermissions || allPermissionsGranted.value) {
  190.         "所有权限都已授予".logE()
  191.         agree.invoke()
  192.     } else {
  193.         if (isShowDialog.value) {
  194.             Dialog(onDismissRequest = {
  195.                 isShowDialog.value = false
  196.                 refuse.invoke()
  197.             }) {
  198.                 // 自定义对话框内容
  199.                 Card(
  200.                     colors = CardDefaults.cardColors(
  201.                         containerColor = Color.White,           // 默认状态
  202.                         disabledContainerColor = Color.LightGray // 禁用状态
  203.                     )
  204.                 ) {
  205.                     Column(
  206.                         modifier = Modifier.padding(20.dp),
  207.                         horizontalAlignment = Alignment.CenterHorizontally
  208.                     ) {
  209.                         Text(
  210.                             text = "申请权限",
  211.                             fontSize = 18.sp,
  212.                             modifier = Modifier.padding(bottom = 18.dp)
  213.                         )
  214.                         Spacer(modifier = Modifier.height(10.dp))
  215.                         Text(
  216.                             text = "需要蓝牙权限来扫描和连接附近的设备",
  217.                             fontSize = 16.sp,
  218.                             modifier = Modifier.padding(bottom = 16.dp)
  219.                         )
  220.                         Spacer(modifier = Modifier.height(10.dp))
  221.                         Row(
  222.                             modifier = Modifier.fillMaxWidth(),
  223.                             horizontalArrangement = Arrangement.Center
  224.                         ) {
  225.                             Button(
  226.                                 modifier = Modifier.weight(1f),
  227.                                 colors = ButtonDefaults.buttonColors(
  228.                                     containerColor = Color.Gray.copy(alpha = 0.5f),
  229.                                     contentColor = Color.White
  230.                                 ),
  231.                                 onClick = {
  232.                                     isShowDialog.value = false
  233.                                     refuse.invoke()
  234.                                 }) {
  235.                                 Text("取消")
  236.                             }
  237.                             Spacer(modifier = Modifier.width(16.dp))
  238.                             Button(
  239.                                 modifier = Modifier.weight(1f),
  240.                                 onClick = {
  241.                                     permissionLauncher.launch(bluetoothPermissions)
  242.                                 }) {
  243.                                 Text("申请", color = MaterialTheme.colorScheme.onPrimary)
  244.                             }
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.         }
  250.     }
  251. }
复制代码
申请相机权限
  1. import android.Manifest
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.content.pm.PackageManager
  6. import android.net.Uri
  7. import android.provider.Settings
  8. import androidx.activity.compose.rememberLauncherForActivityResult
  9. import androidx.activity.result.contract.ActivityResultContracts
  10. import androidx.compose.foundation.layout.Arrangement
  11. import androidx.compose.foundation.layout.Column
  12. import androidx.compose.foundation.layout.Row
  13. import androidx.compose.foundation.layout.Spacer
  14. import androidx.compose.foundation.layout.fillMaxWidth
  15. import androidx.compose.foundation.layout.height
  16. import androidx.compose.foundation.layout.padding
  17. import androidx.compose.foundation.layout.width
  18. import androidx.compose.material3.Button
  19. import androidx.compose.material3.ButtonDefaults
  20. import androidx.compose.material3.Card
  21. import androidx.compose.material3.CardDefaults
  22. import androidx.compose.material3.MaterialTheme
  23. import androidx.compose.material3.Text
  24. import androidx.compose.runtime.Composable
  25. import androidx.compose.runtime.mutableStateListOf
  26. import androidx.compose.runtime.mutableStateOf
  27. import androidx.compose.runtime.remember
  28. import androidx.compose.ui.Alignment
  29. import androidx.compose.ui.Modifier
  30. import androidx.compose.ui.graphics.Color
  31. import androidx.compose.ui.platform.LocalContext
  32. import androidx.compose.ui.unit.dp
  33. import androidx.compose.ui.unit.sp
  34. import androidx.compose.ui.window.Dialog
  35. import androidx.core.app.ActivityCompat
  36. import androidx.core.content.ContextCompat
  37. import com.yak.bleSdk.log.logE
  38. import com.yak.bleSdk.log.logI
  39. private val cameraPermissions by lazy {
  40.     arrayOf(Manifest.permission.CAMERA)
  41. }
  42. /**
  43. * 检查相机权限
  44. */
  45. fun checkCameraPermissions(context: Context): Boolean {
  46.     // 检查是否已拥有所有权限
  47.     val hasAllPermissions = cameraPermissions.all { permission ->
  48.         ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
  49.     }
  50.     return hasAllPermissions
  51. }
  52. /**
  53. * 请求相机权限
  54. * @param isRequest 是否请求权限, 这个布尔值可以用来控制申请权限的时机比如按下某个按钮后申请权限,如果不需要选择时机,可以默认为true
  55. *  如果需要控制申请时机,请参考:
  56. *  ```kotlin
  57. *     val isRequestCameraPermissions = remember { mutableStateOf(false) }
  58. *     RequestCameraPermissions(
  59. *         isRequest = isRequestCameraPermissions.value,
  60. *         agree = {
  61. *             // 用户同意权限后的操作
  62. *         },
  63. *         refuse = {
  64. *             // 用户拒绝权限后的操作
  65. *         }
  66. *     )
  67. *     Button(
  68. *             onClick = {
  69. *                 if(!checkCameraPermissions(context)){
  70. *                     isRequestCameraPermissions.value = true
  71. *                 }
  72. *             },
  73. *         ) {
  74. *             Text("点击申请权限", modifier = Modifier.padding(8.dp))
  75. *     }
  76. * ```
  77. * @param agree 同意
  78. * @param refuse 拒绝
  79. */
  80. @Composable
  81. fun RequestCameraPermissions(isRequest: Boolean = true, agree: () -> Unit, refuse: () -> Unit) {
  82.     if (!isRequest) {
  83.         return
  84.     }
  85.     val context = LocalContext.current
  86.     val activity = LocalContext.current as Activity
  87.     val allPermissionsGranted = remember { mutableStateOf(false) }
  88.     // 记录被永久拒绝的权限列表
  89.     val permanentlyDeniedPermissions = remember { mutableStateListOf<String>() }
  90.     val permissionLauncher = rememberLauncherForActivityResult(
  91.         ActivityResultContracts.RequestMultiplePermissions()
  92.     ) { permissionsMap ->
  93.         allPermissionsGranted.value = permissionsMap.values.all { it }
  94.         if (allPermissionsGranted.value) {
  95.             // 所有权限都已授予
  96.             "相机权限已授予".logI()
  97.             agree.invoke()
  98.         } else {
  99.             // 处理权限被拒绝的情况
  100.             "相机权限被拒绝".logE()
  101.             refuse.invoke()
  102.             // 遍历结果,找出被拒绝的权限,并判断是否为永久拒绝
  103.             permissionsMap.entries.forEach { entry ->
  104.                 val permission = entry.key
  105.                 val isGranted = entry.value
  106.                 if (!isGranted) {
  107.                     // 关键判断:检查该权限是否被永久拒绝
  108.                     if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
  109.                         "有权限被永久拒绝".logE()
  110.                         permanentlyDeniedPermissions.add(permission)
  111.                     }
  112.                 }
  113.             }
  114.         }
  115.     }
  116.     val isShowRefusePermissionDialog = remember { mutableStateOf(true) }
  117.     // 如果有权限被永久拒绝,可以在这里提示用户前往应用设置页手动开启
  118.     if (permanentlyDeniedPermissions.isNotEmpty() && isShowRefusePermissionDialog.value) {
  119.         // 例如,显示一个对话框引导用户去设置
  120.         Dialog(onDismissRequest = {
  121.             isShowRefusePermissionDialog.value = false
  122.             refuse.invoke()
  123.         }) {
  124.             // 自定义对话框内容
  125.             Card(
  126.                 colors = CardDefaults.cardColors(
  127.                     containerColor = Color.White,           // 默认状态
  128.                     disabledContainerColor = Color.LightGray // 禁用状态
  129.                 )
  130.             ) {
  131.                 Column(
  132.                     modifier = Modifier.padding(20.dp),
  133.                     horizontalAlignment = Alignment.CenterHorizontally
  134.                 ) {
  135.                     Text(
  136.                         text = "温馨提示",
  137.                         fontSize = 18.sp,
  138.                         modifier = Modifier.padding(bottom = 18.dp)
  139.                     )
  140.                     Spacer(modifier = Modifier.height(10.dp))
  141.                     Text(
  142.                         text = "需要相机权限来扫描二维码,但是权限被拒绝,请前往设置页面手动开启",
  143.                         fontSize = 16.sp,
  144.                         modifier = Modifier.padding(bottom = 16.dp)
  145.                     )
  146.                     Spacer(modifier = Modifier.height(10.dp))
  147.                     Row(
  148.                         modifier = Modifier.fillMaxWidth(),
  149.                         horizontalArrangement = Arrangement.Center
  150.                     ) {
  151.                         Button(
  152.                             modifier = Modifier.weight(1f),
  153.                             onClick = {
  154.                                 isShowRefusePermissionDialog.value = false
  155.                                 // 跳转到应用设置页面
  156.                                 val intent = Intent(
  157.                                     Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
  158.                                     Uri.parse("package:${context.packageName}")
  159.                                 )
  160.                                 context.startActivity(intent)
  161.                             }) {
  162.                             Text("知道了", color = MaterialTheme.colorScheme.onPrimary)
  163.                         }
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.         return
  169.     }
  170.     // 检查是否已拥有所有权限
  171.     val hasAllPermissions = remember(cameraPermissions) {
  172.         cameraPermissions.all { permission ->
  173.             ContextCompat.checkSelfPermission(
  174.                 context,
  175.                 permission
  176.             ) == PackageManager.PERMISSION_GRANTED
  177.         }
  178.     }
  179.     val isShowDialog = remember { mutableStateOf(true) }
  180.     if (hasAllPermissions || allPermissionsGranted.value) {
  181.         "相机权限已授予".logI()
  182.         agree.invoke()
  183.     } else {
  184.         if (isShowDialog.value) {
  185.             Dialog(onDismissRequest = {
  186.                 isShowDialog.value = false
  187.                 refuse.invoke()
  188.             }) {
  189.                 // 自定义对话框内容
  190.                 Card(
  191.                     colors = CardDefaults.cardColors(
  192.                         containerColor = Color.White,           // 默认状态
  193.                         disabledContainerColor = Color.LightGray // 福用状态
  194.                     )
  195.                 ) {
  196.                     Column(
  197.                         modifier = Modifier.padding(20.dp),
  198.                         horizontalAlignment = Alignment.CenterHorizontally
  199.                     ) {
  200.                         Text(
  201.                             text = "申请权限",
  202.                             fontSize = 18.sp,
  203.                             modifier = Modifier.padding(bottom = 18.dp)
  204.                         )
  205.                         Spacer(modifier = Modifier.height(10.dp))
  206.                         Text(
  207.                             text = "需要相机权限来扫描二维码",
  208.                             fontSize = 16.sp,
  209.                             modifier = Modifier.padding(bottom = 16.dp)
  210.                         )
  211.                         Spacer(modifier = Modifier.height(10.dp))
  212.                         Row(
  213.                             modifier = Modifier.fillMaxWidth(),
  214.                             horizontalArrangement = Arrangement.Center
  215.                         ) {
  216.                             Button(
  217.                                 modifier = Modifier.weight(1f),
  218.                                 colors = ButtonDefaults.buttonColors(
  219.                                     containerColor = Color.Gray.copy(alpha = 0.5f),
  220.                                     contentColor = Color.White
  221.                                 ),
  222.                                 onClick = {
  223.                                     isShowDialog.value = false
  224.                                     refuse.invoke()
  225.                                 }) {
  226.                                 Text("取消")
  227.                             }
  228.                             Spacer(modifier = Modifier.width(16.dp))
  229.                             Button(
  230.                                 modifier = Modifier.weight(1f),
  231.                                 onClick = {
  232.                                     permissionLauncher.launch(cameraPermissions)
  233.                                 }) {
  234.                                 Text("申请", color = MaterialTheme.colorScheme.onPrimary)
  235.                             }
  236.                         }
  237.                     }
  238.                 }
  239.             }
  240.         }
  241.     }
  242. }
复制代码
请求打开蓝牙
  1. import android.bluetooth.BluetoothAdapter
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.provider.Settings
  5. import androidx.compose.foundation.layout.Arrangement
  6. import androidx.compose.foundation.layout.Column
  7. import androidx.compose.foundation.layout.Row
  8. import androidx.compose.foundation.layout.Spacer
  9. import androidx.compose.foundation.layout.fillMaxWidth
  10. import androidx.compose.foundation.layout.height
  11. import androidx.compose.foundation.layout.padding
  12. import androidx.compose.foundation.layout.width
  13. import androidx.compose.material3.Button
  14. import androidx.compose.material3.ButtonDefaults
  15. import androidx.compose.material3.Card
  16. import androidx.compose.material3.CardDefaults
  17. import androidx.compose.material3.Text
  18. import androidx.compose.runtime.Composable
  19. import androidx.compose.runtime.mutableStateOf
  20. import androidx.compose.runtime.remember
  21. import androidx.compose.ui.Alignment
  22. import androidx.compose.ui.Modifier
  23. import androidx.compose.ui.graphics.Color
  24. import androidx.compose.ui.platform.LocalContext
  25. import androidx.compose.ui.unit.dp
  26. import androidx.compose.ui.unit.sp
  27. import androidx.compose.ui.window.Dialog
  28. /**
  29. * 检查蓝牙是否已开启
  30. */
  31. fun isBluetoothEnabled(): Boolean {
  32.     val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
  33.     return bluetoothAdapter?.isEnabled ?: false
  34. }
  35. /**
  36. * 请求开启蓝牙功能
  37. */
  38. @Composable
  39. fun RequestOpenBluetooth(isRequest: Boolean = true) {
  40.     if (!isRequest) {
  41.         return
  42.     }
  43.     val context = LocalContext.current
  44.     val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
  45.     val isBluetoothEnabled = remember { mutableStateOf(bluetoothAdapter?.isEnabled ?: false) }
  46.     val isShowDialog = remember { mutableStateOf(true) }
  47.     if (!isBluetoothEnabled.value) {
  48.         if (isShowDialog.value) {
  49.             Dialog(onDismissRequest = {
  50.                 isShowDialog.value = false
  51.             }) {
  52.                 Card(
  53.                     colors = CardDefaults.cardColors(
  54.                         containerColor = Color.White,
  55.                         disabledContainerColor = Color.LightGray
  56.                     )
  57.                 ) {
  58.                     Column(
  59.                         modifier = Modifier.padding(20.dp),
  60.                         horizontalAlignment = Alignment.CenterHorizontally
  61.                     ) {
  62.                         Text(
  63.                             text = "开启蓝牙",
  64.                             fontSize = 18.sp,
  65.                             modifier = Modifier.padding(bottom = 18.dp)
  66.                         )
  67.                         Spacer(modifier = Modifier.height(10.dp))
  68.                         Text(
  69.                             text = "需要开启蓝牙来扫描和连接附近的设备",
  70.                             fontSize = 16.sp,
  71.                             modifier = Modifier.padding(bottom = 16.dp)
  72.                         )
  73.                         Spacer(modifier = Modifier.height(10.dp))
  74.                         Row(
  75.                             modifier = Modifier.fillMaxWidth(),
  76.                             horizontalArrangement = Arrangement.Center
  77.                         ) {
  78.                             Button(
  79.                                 modifier = Modifier.weight(1f),
  80.                                 colors = ButtonDefaults.buttonColors(
  81.                                     containerColor = Color.Gray.copy(alpha = 0.5f),
  82.                                     contentColor = Color.White
  83.                                 ),
  84.                                 onClick = {
  85.                                     isShowDialog.value = false
  86.                                 }) {
  87.                                 Text("取消")
  88.                             }
  89.                             Spacer(modifier = Modifier.width(16.dp))
  90.                             Button(
  91.                                 modifier = Modifier.weight(1f),
  92.                                 onClick = {
  93.                                     openBluetoothSettings(context)
  94.                                     isShowDialog.value = false
  95.                                 }) {
  96.                                 Text("去设置")
  97.                             }
  98.                         }
  99.                     }
  100.                 }
  101.             }
  102.         }
  103.     }
  104. }
  105. /**
  106. * 跳转到蓝牙设置页面
  107. */
  108. fun openBluetoothSettings(context: Context) {
  109.     val intent = Intent(Settings.ACTION_BLUETOOTH_SETTINGS)
  110.     context.startActivity(intent)
  111. }
复制代码
 
 
 
End

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册