HarmonyOS 鸿蒙Next中应用内跳转到位置权限设置页面为什么会出现白屏的情况
HarmonyOS 鸿蒙Next中应用内跳转到位置权限设置页面为什么会出现白屏的情况
代码如下:
let context = getContext(this) as common.UIAbilityContext
let want: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_permission_settings',
parameters: {
pushParams: {
bundleName: context.abilityInfo.bundleName // 应用包名
}
}
};
context.startAbility(want)
正常应该是这样
但是弹出来的是这样
更多关于HarmonyOS 鸿蒙Next中应用内跳转到位置权限设置页面为什么会出现白屏的情况的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好:
【背景知识】
ohos.permission.LOCATION 前台精确位置权限存在特殊申请条件,不可以单独申请,需要与前台模糊位置权限 ohos.permission.APPROXIMATELY_LOCATION 一起才可申请,详情请参考 ohos.permission.LOCATION。
ohos.permission.LOCATION_IN_BACKGROUND 后台位置权限有安全隐私要求,requestPermissionsFromUser() 接口无法拉起授权弹窗,需要引导用户到应用设置界面手动授予,详情请参考 ohos.permission.LOCATION_IN_BACKGROUND。
【解决方案】
应用权限申请可以参考:应用权限申请开发实践。
针对前台位置权限、后台位置权限不同的申请场景,给出以下解决方案。
- 场景一:
申请前台精确位置权限 ohos.permission.LOCATION,需要和前台模糊位置权限 ohos.permission.APPROXIMATELY_LOCATION 一起申请,示例代码如下:
// ...
const permissionsForeground: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION',];
@Entry
@Component
struct ReqPermission {
@State message: string = 'Hello World'
// 申请用户授权
reqPermissionsFromUser(permissions: Array<Permissions>): void {
let context: Context = getContext(this) as common.UIAbilityContext;
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); // 获取访问控制模块
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager.requestPermissionsFromUser(context, permissions).then((data: PermissionRequestResult) => {
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
// 用户授权,可以继续访问目标操作
AlertDialog.show({ message: "授权成功" })
console.info("(授权完成)")
} else {
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限,或者二次向用户申请授权
console.info("(授权失败)")
return;
}
}
// 授权成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}
// ...
}
- 场景二:
申请后台位置权限 ohos.permission.LOCATION_IN_BACKGROUND 需要先申请前台位置权限,直接前往应用设置页面不会显示位置权限的选项。申请前台位置权限后,需要引导用户前往应用设置页面手动授权,示例代码如下:
function openPermissionsInSystemSettings(context: common.UIAbilityContext): void {
let wantInfo: Want = {
bundleName: "com.huawei.hmos.settings",
abilityName: "com.huawei.hmos.settings.MainAbility",
uri: 'application_info_entry',
// action: 'action.settings.app.info',
parameters: {
settingsParamBundleName: 'com.example.api11' // 替换为指定应用的详情页面
}
}
context.startAbility(wantInfo).then(() => {
// ...
}).catch((err: BusinessError) => {
// ...
})
}
【常见FAQ】
Q:如何二次向用户申请授权。 A:当应用通过 requestPermissionsFromUser() 拉起弹框请求用户授权时,用户拒绝授权。应用将无法再次通过 requestPermissionsFromUser() 拉起弹框,可以使用 二次向用户申请授权 调用 requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限,示例代码如下:
// ...
const permissionsForeground: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION',];
@Entry
@Component
struct ReqPermission {
@State message: string = 'Hello World'
// 二次向用户申请授权
reqPermissionsFromUserSecond(permissions: Array<Permissions>): void {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
atManager.requestPermissionOnSetting(context, permissions)
.then((data: Array<abilityAccessCtrl.GrantStatus>) => {
})
.catch((err: BusinessError) => {
console.error(`Failed to second request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}
// ...
}
Q:如何判断并打开系统位置开关。 A:位置:isLocationEnabled 判断位置服务是否已经使能,返回 true 表示位置信息开关已开启,false 表示位置信息开关已关闭;如果全局开关被关闭,则需要调用 requestGlobalSwitch() 方法来打开它,示例代码如下:
// ...
@Entry
@Component
struct ReqPermission {
@State message: string = 'Hello World'
// 获取当前位置开关状态,拉起全局开关设置弹框。
isLocationToggle(): void {
let atManager = abilityAccessCtrl.createAtManager();
// 判断当前位置开关状态是否开启
let isLocationEnabled = geoLocationManager.isLocationEnabled();
let context: Context = getContext(this) as common.UIAbilityContext;
if (!isLocationEnabled) {
// 拉起全局开关设置弹框
atManager.requestGlobalSwitch(context, abilityAccessCtrl.SwitchType.LOCATION).then((data: boolean) => {
if (data) {
// 开启
} else {
// 未开启
}
}).catch((err: BusinessError) => {
console.error(`Failed to request global switch. Code is ${err.code}, message is ${err.message}`);
});
} else {
// 开启
}
}
// ...
}
更多关于HarmonyOS 鸿蒙Next中应用内跳转到位置权限设置页面为什么会出现白屏的情况的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
openPermissionSettingsPage() {
const context = getContext() as common.UIAbilityContext
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 跳转系统设置页
context.startAbility({
bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名
abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名
uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务
parameters: {
// 按照包名打开对应设置页
pushParams: bundleInfo.name
}
})
}
我的实现是这样,没出过问题
现在看好像是只有每次有弹窗出来,跳转之后才会正常显示,
let want1: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
pushParams: context.abilityInfo.bundleName
}
};
跳到应用信息就
在鸿蒙Next中应用内跳转位置权限设置页面出现白屏,通常是由于权限设置页面的系统级Activity未正确响应或调用参数异常导致。常见原因包括:
- 未正确处理ohos.permission.LOCATION权限声明;
- 跳转Intent的目标Action(如"action.settings.location")配置错误;
- 系统权限管理模块临时性异常。
可通过检查Ability的onRequestPermissionsFromUserResult回调状态及Intent参数进行排查。
根据提供的代码和现象描述,这个问题可能是由于以下原因导致的:
-
权限设置页面的URI参数可能不正确。在HarmonyOS Next中,权限设置页面的URI格式可能有更新。
-
尝试修改want对象中的uri参数为:
uri: 'ability://settings/application_permission_settings'
- 同时确保你的应用已经正确声明了位置权限,在config.json中应有:
"reqPermissions": [
{
"name": "ohos.permission.LOCATION"
}
]
- 检查设备上是否确实存在com.huawei.hmos.settings这个应用包,不同设备版本可能包名有差异。
如果问题仍然存在,建议检查系统日志获取更详细的错误信息,通常可以通过hdc shell hilog
命令查看相关日志。