Ionic android请求位置权限

3
我想要实现的目标:
如果用户的位置服务默认情况下防止我获取他/她的手机位置,我希望在 Android 4.1.2-7.1.1 (API 16-25) 的每个 API 上请求位置权限。
由于在 iOS 上我没有遇到这个问题,所以我想重点关注 Android。

我已经尝试过的:
  • <uses-permission android:name="android.premission.ACCESS_COARSE_LOCATION" />
  • <uses-permission android:name="android.premission.ACCESS_FINE_LOCATION" />
  • cordova-plugin-android-premissions

上述提到的插件即使设备上拒绝访问位置,始终返回hasPermission: true,因此对我无效。

我还没有尝试过的:

我的理解是,Diagnostic 插件说明我必须选择 API 23 及以上或 API 22 及以下版本。(<preference name="android-targetSdkVersion" value="22"/>是最低目标版本。)尽管我不知道它是否仍然适用于较低的 API 版本。

我的设置:
  • Cordova CLI:6.2.0
  • Gulp CLI 和本地版本:3.9.1
  • Ionic Framework:1.3.1
  • Ionic CLI:1.7.16
  • Node:4.2.2
  • Android 设备:5.0.1
  • 期望构建目标:16
  • 当前构建目标:22
1个回答

10
诊断插件说明称,我需要在 API 23 或以上版本和 API 22 或以下版本之间进行选择(最低目标版本)。但我不知道它是否仍能在更低的 API 版本上工作。
cordova-diagnostic-plugin API 级别要求基于用于构建的 SDK 版本,而不是在目标设备上运行的 API 版本。因此,使用用于 API 23(Android 6.0)的 SDK 构建的应用程序仍将在运行旧版本 Android 的设备上工作。
您需要将生成目标设置为 API 23(或更高),以使用插件的主要版本(cordova.plugins.diagnostic 而不是 cordova.plugins.diagnostic.api-22),因为它包括需要 API 23+ 的构建环境的运行时权限代码。
如果用户的位置服务默认情况下阻止我获取他/她手机的位置,则希望在 16 到 25 之间的每个 API(Android 4.1.2-7.1.1)请求位置权限。
这有两个不同的方面:
要在 16 到 25 之间的每个 API(Android 4.1.2-7.1.1)请求位置权限。
Android 运行时权限是在 API 23(Android 6.0)中引入的。
您可以使用isLocationAuthorized()检查应用程序是否具有位置授权。在运行 Android 5(API 22)或更低版本的设备上调用它将始终返回 TRUE,因为权限已经在安装时授予。
您可以使用requestLocationAuthorization()请求运行时权限以使用位置。在运行 Android 5(API 22)或更低版本的设备上调用它将无效,因为权限已经在安装时授予。
位置服务阻止我获取他/她手机的位置。您可以使用isLocationEnabled()检查用户是否关闭了位置功能。
如果位置已关闭,您可以使用switchToLocationSettings()打开设备的位置设置页面以允许用户启用位置服务,或者您可以使用cordova-plugin-request-location-accuracy来请求所需的位置准确性,无需用户在位置设置页面上手动执行此操作。
声明:我是cordova-diagnostic-plugincordova-plugin-request-location-accuracy的作者。

1
现在一切都正常工作了!非常感谢@DaveAlden的大力支持和总结可能性! - MagicDragon
嗨@DaveAlden!也许你能帮我!我有一个使用地理位置的应用程序。一切都很好,直到新版本发布。新版本包含了Google建议我们进行的清单更改(使用硬件.location.gps的uses-feature)。现在我的应用程序无法获取当前位置:/ 我在我的清单文件中有这些: ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATIONandroid.hardware.location.gps android.hardware.location.network - Łukasz Ksawery Rozbicki
1
当我使用你的诊断插件时,一切似乎都很好。这些方法返回true或有关高精度的信息: getLocationAuthorizationStatus isNetworkLocationEnabled isNetworkLocationAvailable isGpsLocationEnabled isGpsLocationAvailable getLocationMode requestLocationAuthorization isLocationEnabled isLocationAuthorized isLocationAvailable然而,当我尝试获取位置时,结果是“位置被拒绝”。这个问题出现在Android 4.3、4.4、5.0和5.1上。有时也会在6.x上出现。我的应用程序能够在某些设备上获取位置,但在其他设备上失败。 - Łukasz Ksawery Rozbicki

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