Android 12+ Flutter应用附近设备权限请求报错求助
解决Android 12+ Flutter应用扫描SumUp设备崩溃问题
问题根源
Android 12(API 31)及以上版本中,蓝牙扫描和连接权限属于「附近设备」权限组,必须通过运行时动态请求才能获得,仅在AndroidManifest.xml中静态声明会导致权限被自动拒绝,进而引发设备扫描崩溃。
1. 添加必要依赖
在app模块的build.gradle(或build.gradle.kts)的dependencies块中补充AndroidX Activity Result API依赖——这是解决registerForActivityResult和ActivityResultContracts未解析错误的核心:
dependencies { // 保留原有依赖,新增以下两行 implementation 'androidx.activity:activity-ktx:1.8.0' implementation 'androidx.fragment:fragment-ktx:1.6.1' }
版本可根据项目实际情况调整,确保与
compileSdkVersion 33兼容即可。
2. 修正后的MainActivity代码
import android.Manifest import android.os.Build import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.ActivityResultCallback import io.flutter.embedding.android.FlutterActivity class MainActivity : FlutterActivity() { // 注册多权限请求回调 private val requestMultiplePermissions = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions(), ActivityResultCallback<Map<String, Boolean>> { permissions -> // 处理权限请求结果 permissions.forEach { (permission, isGranted) -> if (!isGranted) { // 权限被拒绝时,可提示用户前往设置手动开启 } } } ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 仅在Android 12+发起权限请求 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { requestMultiplePermissions.launch( arrayOf( Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT ) ) } } }
3. 重要注意事项
- 保留原有
AndroidManifest.xml中的权限声明,静态声明是运行时请求的前提; - 若用户拒绝权限后需要再次请求,可在回调中引导用户进入应用设置页面开启「附近设备」权限;
- 测试时需确保测试设备为Android 12及以上版本,低版本无需处理这两个蓝牙权限的动态请求。
内容的提问来源于stack exchange,提问作者valley
相关产品推荐
相关产品推荐

