문제: 휴대폰 위치 확인 권한을 획득한 후 사용자가 거부를 클릭한 후 위치 확인 버튼을 다시 클릭하면 휴대폰이 응답하지 않습니다. 여기서 안드로이드 시스템이 두 번 거부한 후에는 문의 팝업창이 팝업되지 않도록 기본적으로 설정되어 있으므로 해당 위치를 다시 클릭하면 당연히 응답이 없습니다.
1. 해결 방법: 먼저 GPS 기능(안드로이드)이 켜져 있는지 확인해보세요. 켜져 있으면 지도 위치 페이지로 바로 이동하고, 꺼져 있으면 시스템 설정으로 이동합니다. ;
다음은 모두 Android 예시입니다.
원본 코드:
import { checkOpenGPSServiceByAndroid } from "@/utils/device";
/*.
.
.
*/
/*
定位按钮触发事件
*/
onGPSAddress() {
checkOpenGPSServiceByAndroid()
// 获取当前位置
uni.getLocation({
type: "gcj02", //返回可以用于uni.openLocation的经纬度
success: res => {
let latitude = res.latitude;
let longitude = res.longitude;
uni.chooseLocation({
latitude,
longitude,
success: data => {
//此处仅返回详细地址和经纬度,所以要进行经纬度解析
this.getCity(data.latitude, data.longitude);
},
fail: fail => {
checkOpenGPSServiceByAndroid();
}
});
}
});
},
// 解析经纬度
getCity(latitude, longitude) {
let location = `${longitude},${latitude}`;
var myAmapFun = new amapFile.AMapWX({
key: amapKey,
batch: true
});
myAmapFun.getRegeo({
//如果经纬度有问题会导致不进入回调方法,从而报错
location: location,
success: e => {
//成功回调
console.log(e);
let addressComponent = e[0].regeocodeData.addressComponent;
let formatted_address = e[0].regeocodeData.formatted_address;
this.detail = formatted_address;
this.city = addressComponent.city;
this.province = addressComponent.province;
this.provinceCity = addressComponent.province + addressComponent.city;
this.district = addressComponent.district;
this.districtId = addressComponent.adcode;
this.location = e[0].location;
this.longitude = e[0].longitude;
},
fail: function (info) {
//失败回调
console.log(info);
}
});
},
device.js 파일:
let system = uni.getSystemInfoSync(); // 获取系统信息
/**检查是否打开GPS功能(android)**/
export const checkOpenGPSServiceByAndroid = () => {
if (system.platform === 'android') { // 判断平台
var context = plus.android.importClass("android.content.Context");
var locationManager = plus.android.importClass("android.location.LocationManager");
var main = plus.android.runtimeMainActivity();
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
uni.showModal({
title: '提示',
content: '请打开定位服务功能',
success(res) {
if (res.confirm) {
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
var Intent = plus.android.importClass('android.content.Intent');
var Settings = plus.android.importClass('android.provider.Settings');
var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
} else {
console.log('GPS功能已开启');
}
}
}
});
return
}
}
}
/* 该问题用不到下面的方法,请忽略 */
/**
* 检查通知是否开启
*/
export const noticMsgTool = () => {
//如果没有打开 则可以 去 请求打开
if (system.platform == "ios") {
//苹果打开对应的通知栏
uni.showModal({
title: "通知权限开启提醒",
content: "您还没有开启通知权限,无法接受到消息通知,请前往设置!",
confirmText: "去设置",
success: function(res) {
if (res.confirm) {
var app = plus.ios.invoke("UIApplication", "sharedApplication");
var setting = plus.ios.invoke("NSURL", "URLWithString:", "app-settings:");
plus.ios.invoke(app, "openURL:", setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
}
}
});
} else {
//android打开对应的通知栏
var main = plus.android.runtimeMainActivity();
var pkName = main.getPackageName();
var uid = main.getApplicationInfo().plusGetAttribute("uid");
var Intent = plus.android.importClass('android.content.Intent');
var Build = plus.android.importClass("android.os.Build");
uni.showModal({
title: "通知权限开启提醒",
content: "您还没有开启通知权限,无法接受到消息通知,请前往设置!",
confirmText: "去设置",
success: function(res) {
if (res.confirm) {
if (Build.VERSION.SDK_INT >= 26) {
var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
} else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0
var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
intent.putExtra("app_package", pkName);
intent.putExtra("app_uid", uid);
} else { //(<21)其他--跳转到该应用管理的详情页
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", main.getPackageName(), null);
intent.setData(uri);
}
// 跳转到该应用的系统通知设置页
main.startActivity(intent);
}
}
});
}
}
Du Niang ' Android의 GPS 기능이 켜져 있는지 감지 '한 후 코드는 위의 5가지 이상의 방법으로 모두 수행되었으며 PDA(Android 9.0 버전)를 테스트할 때 위의 코드 감지가 항상 켜져 있었습니다. Transsion 휴대폰(Android 10 버전)에서는 위 코드 감지가 항상 비활성화되어 있으며, 위 코드를 이용하여 설정 페이지를 열 경우 정보 위치 인증 팝업창이 팝업되지 않습니다.
2. 솔루션 아이디어: 사용자 작업 팝업 창 거부, 금지 및 이벤트 허용을 감지하고 필요한 권한이 거부된 경우 앱 설정 인터페이스를 열고 앱 설정 인터페이스에서 해당 권한을 열 수 있습니다.
device.js 파일 코드 조정:
let system = uni.getSystemInfoSync(); // 获取系统信息
/**检查是否打开GPS功能(android)**/
export const checkOpenGPSServiceByAndroid = () => {
if (system.platform === 'android') { // 判断平台
openGps();
}
}
/**
* 定位权限及弹出权限弹框 监听用户点击按钮
* **/
export const openGps = () => {
plus.android.requestPermissions(
['android.permission.ACCESS_FINE_LOCATION'],
function(resultObj) {
console.log('resultObj---', resultObj);
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
// console.log(6, '已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
// console.log(5, '拒绝本次申请的权限:' + deniedPresentPermission);
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
// console.log(4, '永久拒绝申请的权限:' + deniedAlwaysPermission);
result = -1
}
// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
if (result != 1) {
//如果用户第一次拒绝后,跳转到**应用**的权限页面
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
},
function(error) {
console.log('申请权限错误:' + error.code + " = " + error.message);
resolve({
code: error.code,
message: error.message
});
}
);
}
사용자가 거부할 때마다 권한 설정으로 이동하게 되는데 이는 불합리합니다.
3. 해결 방법: 사용자가 두 번 거부한 후 해당 위치를 다시 클릭하면 권한을 설정하라는 메시지가 표시됩니다. 시스템 설정으로 이동합니다.
device.js 파일 코드 조정:
let system = uni.getSystemInfoSync(); // 获取系统信息
/**检查是否打开GPS功能(android)**/
export const checkOpenGPSServiceByAndroid = () => {
if (system.platform === 'android') { // 判断平台
openGps();
}
}
/**
* 定位权限及弹出权限弹框 监听用户点击按钮
* **/
let num = 0;
export const openGps = () => {
plus.android.requestPermissions(
['android.permission.ACCESS_FINE_LOCATION'],
function(resultObj) {
console.log('resultObj---', resultObj);
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
// console.log(6, '已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
// console.log(5, '拒绝本次申请的权限:' + deniedPresentPermission);
num += 1
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
// console.log(4, '永久拒绝申请的权限:' + deniedAlwaysPermission);
num += 1
result = -1
}
// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
if (result != 1) {
//如果用户第2次拒绝后,跳转到**应用**的权限页面
if (num > 2) {
uni.showToast({
title: "请到系统设置打开定位服务功能!",
icon: "none",
duration: 1500
})
setTimeout(() => {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}, 2000)
}
}
},
function(error) {
console.log('申请权限错误:' + error.code + " = " + error.message);
resolve({
code: error.code,
message: error.message
});
}
);
}
Android 테스트가 작동합니다.
혹시 잘못된 부분이나 불분명한 부분이 있으면 편하게 토론해서 정정해주세요~