Flutter应用在华为定位权限被拒绝时崩溃

3

我正在实现获取华为设备位置的功能,当权限被授予时它可以工作,但当权限被拒绝时应用程序会崩溃。

使用谷歌提供的位置信息从未发生过这种情况。

以下是我的获取位置代码:

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 Mobile Vision?我真的不知道,这是发生在拒绝位置权限后的情况。
我做错了什么,怎样修复呢?

你是否正在使用这个插件?因为你提到的异常来自该库的文件夹。可能是你忘记添加这个插件的设置步骤了:https://pub.dev/packages/qr_mobile_vision - Dharmendra
是的,我正在使用这个插件,但之前它是可以正常工作的,而且当导入这个插件时它甚至没有使用类,但现在出现了这个错误。 - Karol Wiśniewski
你尝试过更新该库的版本吗? - Dharmendra
我正在使用最新版本。我启动了这个插件,我接受了它的权限 - 它正在工作。然后我去到位置权限,拒绝了它,但仍然出现了这个错误,有点奇怪。 - Karol Wiśniewski
1个回答

3
如果权限被拒绝一次,那么它就会被永久拒绝。因此,用户必须手动从设置中更改它。你所能做的就是将用户重定向到设置页面。 在请求权限之前,请确保权限尚未被拒绝,否则会在没有任何警告的情况下使你的应用程序崩溃,如下面的代码所示。
以下是使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接