Flutter - Android没有请求权限

8
我正在尝试使用插件location获取设备的当前位置,但Android从未要求权限。我收到以下错误信息:

异常已发生。PlatformException (PlatformException(PERMISSION_DENIED_NEVER_ASK, Location permission denied forever- please open app settings, null))

我在可以找到的Android文件夹中的每个 `AndroidManifest.xml´ 文件中添加了下面这行代码(实际上不知道应该使用哪一个,我找到了3个)。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

我尝试使用插件permission_handler手动请求权限,但仍然没有弹出窗口。

我完全迷失了,找不到类似的内容。以下是代码:

Future<LocationData> _getLocation() async {
  LocationData currentLocation;
  
  // returns a map with unreadable numbers which make no sense
  var t = await PermissionHandler()
      .requestPermissions([PermissionGroup.location]);
  
  // returns false
  var test = await location.requestPermission();

  try {
    currentLocation = await location.getLocation();
  } catch (e) {
    currentLocation = null;
  }
  return currentLocation;
}

编辑:我在我的设备上(OnePlus 6)和模拟器(Pixel XL API 28)上尝试了这个。我也尝试卸载/重新安装应用程序。


一种简单的方法是在Android设置中的应用程序设置菜单中手动启用权限。但最好在您的代码中处理此行为。 - Marcos Boaventura
我也曾经遇到OP6T的同样问题,很高兴找到了答案。 - chazefate
4个回答

12

位置插件 的 git 上询问后,我做了以下操作:

flutter clean

我收到了询问权限的弹窗。

感谢这个人


1
我已经尝试了Flutter Clean,但仍然无法在设备上显示... - Gbenga B Ayannuga
亲爱的,不好用,谢谢。 - undefined

4

您可以在代码中处理这种权限行为。即使您从未在模拟器上安装过您的应用程序,此行为也可能发生,您必须在代码中处理此问题,因为当您的应用程序被最终用户使用时,可能会出现此情况。

此异常意味着您从checkPermissionStatus权限处理插件方法得到了PermissionStatus.denied,当用户勾选"不再询问"复选框并拒绝请求时,可能会发生这种情况。

最简单的处理方式是什么?

如果您从checkPermissionStatus方法中获取到PermissionStatus.denied,您可以显示一个对话框告知用户您的应用程序需要该权限以提供更好的体验,在此对话框中,您可以将用户重定向到Android权限设置页面,让用户手动启用所请求的权限。您可以使用权限处理插件中的openAppSettings()方法来实现此操作。

也许您应该阅读这篇文章,虽然有点旧,但它展示了如何在Android中请求和处理用户权限的正确流程。该文章并未涵盖新版Android Q中的权限更改。


这是正确的答案。 - AlvaroSantisteban

2
错误信息试图表明:您的设备(您或在您测试的设备上的其他人)以前选择了从不,当Android之前请求权限时。
这意味着Android不会再次请求权限。

只需在不同的设备上尝试或再次卸载应用程序即可。


我也在模拟器上尝试了,结果相同。我已经卸载/重新安装了应用程序,结果仍然相同。 - Robouste
@Robouste 我现在也遇到了这个问题...我不知道。我已经尝试了flutter clean、卸载和重新安装,但它仍然显示被拒绝。 - Gbenga B Ayannuga
抱歉,我无法提供帮助,因为我自那时起就没有使用过Flutter。 - Robouste

1

添加这个

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

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