踩坑之旅继续,前文介绍到了如何判断是否获取到主流机型的桌面快捷方式权限以更好的提升用户体验。本文继续进阶后续,如果我们确实没获取到权限,怎么更友好地方式去让用户授予权限。笔者也对比了目前大厂的一些实现方案。有些是只有首次添加的时候会给个引导提示,提示用户可能没有获取到权限会导致创建快捷方式失败,有些是会给个h5的链接里面是各个手机的快捷方式权限的开通步骤,有的是会直接跳转到各个机型的权限设置落地页去。
我们之前做的产品也是经过几次迭代,从最初的首次给提示--h5链接--gif图--落地页的演进,经过数据证实转化率最高的还是进落地页,这种用户可以更快捷有效的找到权限设置的方法。
下面列出主流机型跳转快捷方式权限设置的落地页的方案:
默认的兜底页面,系统提供,保质保量
Intent defaultApi(Context context) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
return intent;
}
小米手机:不同的版本有差异
String version = getSystemProperty(MIUI_VERSION_NAME);
if (TextUtils.isEmpty(version)) {
return defaultApi(context);
}
int versionI;
try {
versionI = Integer.parseInt(version.substring(1));
} catch (NumberFormatException e) {
e.printStackTrace();
return defaultApi(context);
}
if (versionI >= 9) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"));
intent.putExtra("extra_pkgname", context.getPackageName());
return intent;
}
if (versionI >= 7) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.putExtra("extra_pkgname", context.getPackageName());
return intent;
}
Vivo手机:
Intent intent = new Intent();
intent.putExtra("packagename", context.getPackageName());
intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity"));
if (hasActivity(context, intent)) return intent;
intent.setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.safeguard.SoftPermissionDetailActivity"));
return intent;
Oppo:
Intent intent = new Intent();
intent.putExtra("packageName", context.getPackageName());
intent.setClassName("com.oppo.launcher", "com.oppo.launcher.shortcut.ShortcutSettingsActivity");
if (hasActivity(context, intent)) return intent;
intent.setComponent(new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity"));
return intent;
华为:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"));
return intent;
实现方案也简单,就是利用adb shell dumpsys activity / adb shell dumpsys window,找出顶级页面或者窗口再去尝试跳转就可以了(或者其他一些工具抓一下页面属性也可以),不过本人精力和项目时间问题,目前也只适配了部分主流机型及部分型号,不同的版本会有一些差异可能导致跳转失败。(但方案类似,大家可以去尝试适配下,有覆盖更全面的方案也可以分享出来,感谢万分)