当前位置:   article > 正文

uniapp 获取手机定位权限及禁止拒绝后跳转设置页面_uniapp获取定位权限

uniapp获取定位权限

问题:获取手机定位权限,在用户点击拒绝后,再次点击定位按钮,手机无反应。这里,安卓系统2次拒绝之后,默认为禁止询问弹窗弹出,所以再点击定位肯定没有反应。

一、解决思路:第一想到,检查是否打开GPS功能(Android),打开了直接跳转到地图定位页面,关闭状态则跳转系统设置;

以下均为Android示例:

原代码:

  1. import { checkOpenGPSServiceByAndroid } from "@/utils/device";
  2. /*.
  3. .
  4. .
  5. */
  6. /*
  7. 定位按钮触发事件
  8. */
  9. onGPSAddress() {
  10. checkOpenGPSServiceByAndroid()
  11. // 获取当前位置
  12. uni.getLocation({
  13. type: "gcj02", //返回可以用于uni.openLocation的经纬度
  14. success: res => {
  15. let latitude = res.latitude;
  16. let longitude = res.longitude;
  17. uni.chooseLocation({
  18. latitude,
  19. longitude,
  20. success: data => {
  21. //此处仅返回详细地址和经纬度,所以要进行经纬度解析
  22. this.getCity(data.latitude, data.longitude);
  23. },
  24. fail: fail => {
  25. checkOpenGPSServiceByAndroid();
  26. }
  27. });
  28. }
  29. });
  30. },
  31. // 解析经纬度
  32. getCity(latitude, longitude) {
  33. let location = `${longitude},${latitude}`;
  34. var myAmapFun = new amapFile.AMapWX({
  35. key: amapKey,
  36. batch: true
  37. });
  38. myAmapFun.getRegeo({
  39. //如果经纬度有问题会导致不进入回调方法,从而报错
  40. location: location,
  41. success: e => {
  42. //成功回调
  43. console.log(e);
  44. let addressComponent = e[0].regeocodeData.addressComponent;
  45. let formatted_address = e[0].regeocodeData.formatted_address;
  46. this.detail = formatted_address;
  47. this.city = addressComponent.city;
  48. this.province = addressComponent.province;
  49. this.provinceCity = addressComponent.province + addressComponent.city;
  50. this.district = addressComponent.district;
  51. this.districtId = addressComponent.adcode;
  52. this.location = e[0].location;
  53. this.longitude = e[0].longitude;
  54. },
  55. fail: function (info) {
  56. //失败回调
  57. console.log(info);
  58. }
  59. });
  60. },

device.js文件:

  1. let system = uni.getSystemInfoSync(); // 获取系统信息
  2. /**检查是否打开GPS功能(android)**/
  3. export const checkOpenGPSServiceByAndroid = () => {
  4. if (system.platform === 'android') { // 判断平台
  5. var context = plus.android.importClass("android.content.Context");
  6. var locationManager = plus.android.importClass("android.location.LocationManager");
  7. var main = plus.android.runtimeMainActivity();
  8. var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
  9. if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
  10. uni.showModal({
  11. title: '提示',
  12. content: '请打开定位服务功能',
  13. success(res) {
  14. if (res.confirm) {
  15. if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
  16. var Intent = plus.android.importClass('android.content.Intent');
  17. var Settings = plus.android.importClass('android.provider.Settings');
  18. var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  19. main.startActivity(intent); // 打开系统设置GPS服务页面
  20. } else {
  21. console.log('GPS功能已开启');
  22. }
  23. }
  24. }
  25. });
  26. return
  27. }
  28. }
  29. }
  30. /* 该问题用不到下面的方法,请忽略 */
  31. /**
  32. * 检查通知是否开启
  33. */
  34. export const noticMsgTool = () => {
  35. //如果没有打开 则可以 去 请求打开
  36. if (system.platform == "ios") {
  37. //苹果打开对应的通知栏
  38. uni.showModal({
  39. title: "通知权限开启提醒",
  40. content: "您还没有开启通知权限,无法接受到消息通知,请前往设置!",
  41. confirmText: "去设置",
  42. success: function(res) {
  43. if (res.confirm) {
  44. var app = plus.ios.invoke("UIApplication", "sharedApplication");
  45. var setting = plus.ios.invoke("NSURL", "URLWithString:", "app-settings:");
  46. plus.ios.invoke(app, "openURL:", setting);
  47. plus.ios.deleteObject(setting);
  48. plus.ios.deleteObject(app);
  49. }
  50. }
  51. });
  52. } else {
  53. //android打开对应的通知栏
  54. var main = plus.android.runtimeMainActivity();
  55. var pkName = main.getPackageName();
  56. var uid = main.getApplicationInfo().plusGetAttribute("uid");
  57. var Intent = plus.android.importClass('android.content.Intent');
  58. var Build = plus.android.importClass("android.os.Build");
  59. uni.showModal({
  60. title: "通知权限开启提醒",
  61. content: "您还没有开启通知权限,无法接受到消息通知,请前往设置!",
  62. confirmText: "去设置",
  63. success: function(res) {
  64. if (res.confirm) {
  65. if (Build.VERSION.SDK_INT >= 26) {
  66. var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
  67. intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
  68. } else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0
  69. var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
  70. intent.putExtra("app_package", pkName);
  71. intent.putExtra("app_uid", uid);
  72. } else { //(<21)其他--跳转到该应用管理的详情页
  73. var Settings = plus.android.importClass("android.provider.Settings");
  74. var Uri = plus.android.importClass("android.net.Uri");
  75. var intent = new Intent();
  76. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  77. var uri = Uri.fromParts("package", main.getPackageName(), null);
  78. intent.setData(uri);
  79. }
  80. // 跳转到该应用的系统通知设置页
  81. main.startActivity(intent);
  82. }
  83. }
  84. });
  85. }
  86. }

度娘‘检测安卓是否开启GPS功能’后,代码均为上面5+方法,测试了PDA(安卓9.0版本)以上代码检测永远是已开启。传音手机(安卓10版本)以上代码检测永远是未开启,如果你用了上面的代码打开设置页面,会导致信息位置授权弹窗不会弹出。

二、解决思路:那检测用户操作弹窗拒绝、禁止、允许的事件,若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限;

device.js文件代码调整:

  1. let system = uni.getSystemInfoSync(); // 获取系统信息
  2. /**检查是否打开GPS功能(android)**/
  3. export const checkOpenGPSServiceByAndroid = () => {
  4. if (system.platform === 'android') { // 判断平台
  5. openGps();
  6. }
  7. }
  8. /**
  9. * 定位权限及弹出权限弹框 监听用户点击按钮
  10. * **/
  11. export const openGps = () => {
  12. plus.android.requestPermissions(
  13. ['android.permission.ACCESS_FINE_LOCATION'],
  14. function(resultObj) {
  15. console.log('resultObj---', resultObj);
  16. var result = 0;
  17. for (var i = 0; i < resultObj.granted.length; i++) {
  18. var grantedPermission = resultObj.granted[i];
  19. // console.log(6, '已获取的权限:' + grantedPermission);
  20. result = 1
  21. }
  22. for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  23. var deniedPresentPermission = resultObj.deniedPresent[i];
  24. // console.log(5, '拒绝本次申请的权限:' + deniedPresentPermission);
  25. result = 0
  26. }
  27. for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  28. var deniedAlwaysPermission = resultObj.deniedAlways[i];
  29. // console.log(4, '永久拒绝申请的权限:' + deniedAlwaysPermission);
  30. result = -1
  31. }
  32. // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
  33. if (result != 1) {
  34. //如果用户第一次拒绝后,跳转到**应用**的权限页面
  35. var Intent = plus.android.importClass("android.content.Intent");
  36. var Settings = plus.android.importClass("android.provider.Settings");
  37. var Uri = plus.android.importClass("android.net.Uri");
  38. var mainActivity = plus.android.runtimeMainActivity();
  39. var intent = new Intent();
  40. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  41. var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  42. intent.setData(uri);
  43. mainActivity.startActivity(intent);
  44. }
  45. },
  46. function(error) {
  47. console.log('申请权限错误:' + error.code + " = " + error.message);
  48. resolve({
  49. code: error.code,
  50. message: error.message
  51. });
  52. }
  53. );
  54. }

每次用户拒绝后,均会跳转到设置权限,不太合理。

三、解决思路:用户拒绝2次之后,用户再次点击定位,提示去设置权限。且跳转到系统设置;

device.js文件代码调整:

  1. let system = uni.getSystemInfoSync(); // 获取系统信息
  2. /**检查是否打开GPS功能(android)**/
  3. export const checkOpenGPSServiceByAndroid = () => {
  4. if (system.platform === 'android') { // 判断平台
  5. openGps();
  6. }
  7. }
  8. /**
  9. * 定位权限及弹出权限弹框 监听用户点击按钮
  10. * **/
  11. let num = 0;
  12. export const openGps = () => {
  13. plus.android.requestPermissions(
  14. ['android.permission.ACCESS_FINE_LOCATION'],
  15. function(resultObj) {
  16. console.log('resultObj---', resultObj);
  17. var result = 0;
  18. for (var i = 0; i < resultObj.granted.length; i++) {
  19. var grantedPermission = resultObj.granted[i];
  20. // console.log(6, '已获取的权限:' + grantedPermission);
  21. result = 1
  22. }
  23. for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  24. var deniedPresentPermission = resultObj.deniedPresent[i];
  25. // console.log(5, '拒绝本次申请的权限:' + deniedPresentPermission);
  26. num += 1
  27. result = 0
  28. }
  29. for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  30. var deniedAlwaysPermission = resultObj.deniedAlways[i];
  31. // console.log(4, '永久拒绝申请的权限:' + deniedAlwaysPermission);
  32. num += 1
  33. result = -1
  34. }
  35. // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
  36. if (result != 1) {
  37. //如果用户第2次拒绝后,跳转到**应用**的权限页面
  38. if (num > 2) {
  39. uni.showToast({
  40. title: "请到系统设置打开定位服务功能!",
  41. icon: "none",
  42. duration: 1500
  43. })
  44. setTimeout(() => {
  45. var Intent = plus.android.importClass("android.content.Intent");
  46. var Settings = plus.android.importClass("android.provider.Settings");
  47. var Uri = plus.android.importClass("android.net.Uri");
  48. var mainActivity = plus.android.runtimeMainActivity();
  49. var intent = new Intent();
  50. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  51. var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  52. intent.setData(uri);
  53. mainActivity.startActivity(intent);
  54. }, 2000)
  55. }
  56. }
  57. },
  58. function(error) {
  59. console.log('申请权限错误:' + error.code + " = " + error.message);
  60. resolve({
  61. code: error.code,
  62. message: error.message
  63. });
  64. }
  65. );
  66. }

安卓测试有效;

有误或不清楚的地方,欢迎大佬们讨论指正~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/274451
推荐阅读
相关标签
  

闽ICP备14008679号