Android 10下QuickStep Launcher解除隐藏后权限缺失崩溃如何解决
解决Android 10中恢复Launcher3隐藏后权限崩溃的问题
问题原因
Launcher3作为系统核心启动器,依赖系统自动授予的签名级权限(如android.permission.STATUS_BAR、android.permission.MANAGE_ACTIVITY_STACKS)——这些权限无需在Manifest中声明,由系统直接赋予系统应用。但通过setApplicationHidden隐藏再恢复后,系统未重新触发该权限授予流程,导致Launcher3启动时因权限缺失崩溃。
可行解决方案
方案1:恢复隐藏后重启Launcher3并重置默认启动器
在调用setApplicationHidden(adminComponent, "com.android.launcher3", false)恢复Launcher3后,执行以下操作:
- 强制停止Launcher3进程:
devicePolicyManager.forceStopPackage(adminComponent, "com.android.launcher3"); - 重新设置Launcher3为默认启动器并启动,确保系统重新识别其系统应用身份:
Intent launcherIntent = context.getPackageManager().getLaunchIntentForPackage("com.android.launcher3"); if (launcherIntent != null) { PackageManager pm = context.getPackageManager(); ComponentName launcherComponent = launcherIntent.getComponent(); // 设置为默认Home应用 pm.addPreferredActivity( new IntentFilter(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY, new ComponentName[]{launcherComponent}, launcherComponent ); // 启动Launcher context.startActivity(launcherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); }
方案2:改用原生锁定任务模式,避免隐藏Launcher3
这是Kiosk模式的标准实现方式,无需修改系统应用状态:
- 预先配置允许进入锁定任务模式的应用:
String[] allowedKioskApps = {"你的Kiosk应用包名"}; devicePolicyManager.setLockTaskPackages(adminComponent, allowedKioskApps); - 进入Kiosk模式:
// 启动Kiosk应用 Intent kioskIntent = context.getPackageManager().getLaunchIntentForPackage("你的Kiosk应用包名"); context.startActivity(kioskIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); // 启用锁定任务 if (devicePolicyManager.isLockTaskPermitted("你的Kiosk应用包名")) { ((Activity) context).startLockTask(); } - 退出Kiosk模式:
((Activity) context).stopLockTask(); // Launcher3可直接正常启动,无权限问题
方案3:强制同步权限(测试/特殊场景)
针对测试设备,可通过ADB命令手动授予权限(需Root或系统签名权限):
adb shell pm grant com.android.launcher3 android.permission.STATUS_BAR adb shell pm grant com.android.launcher3 android.permission.MANAGE_ACTIVITY_STACKS
内容的提问来源于stack exchange,提问作者Ankit Koirala
相关产品推荐
相关产品推荐

