我正在为华为设备实现设备定位,它在获得许可时工作,但当被拒绝时,应用程序正在崩溃。
谷歌的位置从来没有发生过。
以下是我获取位置的代码:
Future<Location?> getAccuratePositionH() async {
PermissionHandler permissionHandler = PermissionHandler();
bool status = await permissionHandler.requestLocationPermission();
if (status) {
FusedLocationProviderClient locationService = FusedLocationProviderClient();
Location location = await locationService.getLastLocation();
return location;
}
else {
return null;
}
}这就是我在控制台得到的信息:
I/cgr.qrmv.QrMobVisPlugin( 5178): Permissions request denied.
W/cgr.qrmv.QrMobVisPlugin( 5178): Starting QR Mobile Vision failed
W/cgr.qrmv.QrMobVisPlugin( 5178): com.github.rmtmckenzie.qrmobilevision.QrReader$Exception: QR reader failed because noPermissions和
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.lea24.partyfinder/com.lea24.partyfinder.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'io.flutter.plugin.common.MethodChannel$Result com.github.rmtmckenzie.qrmobilevision.QrMobileVisionPlugin$ReadingInstance.startResult' on a null object reference为什么这里是QR移动视觉?我不知道,真的,这是在拒绝了位置许可之后发生的。
我做错了什么,怎么解决呢?
发布于 2022-09-13 08:12:11
我迟到了,但这可能会对其他面临这个问题的人有所帮助,我也面临着同样的问题,经过一番努力,我终于找到了对我有用的原因和解决方案。希望它也能对你起作用。
如果权限被拒绝,则该权限将被永久拒绝。因此,用户必须手动更改设置。您所能做的就是将用户重定向到设置。在请求许可之前,请确保许可没有被拒绝,否则它将在没有任何警告的情况下使您的应用程序崩溃,如下代码所示。
下面是一个代码,它使用permission_handler请求权限,使用Getx显示无内容对话框。此函数将返回权限状态,您可以通过检查是否允许使用它来继续使用它。
PermissionStatus status = await requestLocalStoragePermission();
if (status.isGranted) {
//proceed
}全码
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';Future<PermissionStatus> requestLocalStoragePermission() async {
PermissionStatus status;
if ((await Permission.storage.isPermanentlyDenied) ||
(await Permission.storage.isDenied)) {
status = PermissionStatus.denied;
Get.dialog(
AlertDialog(
//Getx dialog is used, you may use default other dialog based on your requirement
title: const Text(
"Storage permission required!",
textAlign: TextAlign.center,
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
content: const Text(
"Storage permission is required to download files",
textAlign: TextAlign.center,
),
actions: <Widget>[
Center(
child: TextButton(
onPressed: () async => {
await openAppSettings(), //function in permission_handler
Get.back() //close dialog
},
child: const Text("Grant Permission"),
),
),
],
),
);
} else {
try {
status = await Permission.storage.request();
} catch (err) {
status = PermissionStatus.denied;
}
}
return status;
}https://stackoverflow.com/questions/72730011
复制相似问题