【问题标题】:Set Default Android Launcher on Huawei devices?在华为设备上设置默认 Android 启动器?
【发布时间】:2019-01-06 07:49:29
【问题描述】:

我的目标是将我的应用设置为华为设备上的默认启动器。

1 - 解释:

1.1 - 当前情况:

我已经能够:

  • 检查我的应用是否是默认启动器
  • 显示“启动器选择器”(带有“使用一次”/“始终”选项)

一切正常。华为设备除外!

在我看来,华为的 Android 风格并没有正确地“尊重”“ACTION_MANAGE_DEFAULT_APPS_SETTINGS”意图操作合约。

// this displays the list of default apps on all tested devices, except on Huawei devices!
// instead, it does display apps permissions, app links and apps'advanced settings
intent.setAction(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
activity.startActivity(intent);

作为 B 计划,我可以使用以下方式显示“应用程序和通知”设置“页面”:

String packageName = "com.android.settings";
String className = "Settings$AppAndNotificationDashboardActivity";
intent.setClassName(packageName, packageName + "." + className);
activity.startActivity(intent);

所以用户可以从那里导航,按下这个菜单项序列:

  • -> 高级参数(可扩展菜单项:平板电脑上不存在,手机上也不确定)
  • -> 默认应用
  • -> 默认启动器

这需要我想避免的 2 或 3 个步骤。

1.2 - 这可以改进!

I found out that when the "-> Default Apps" menu item is selected, a (com.android.settings, .SubSettings) Intent (with extra) is launched but I was not able使其工作(拒绝许可)。

但是我安装了Nova Launcher,结果发现它可以在华为设备上显示“->默认应用”设置页面!
因此,用户登陆一个页面,她/他只需点击“-> 默认启动器”,然后选择默认启动器:更容易。

2 - 问题:

我认为在华为设备上无法显示“Lancher Picker”,这是我的问题:
如何在华为设备上(如 Nova Launcher 那样)显示“-> 默认应用”设置页面(图片在此处)?
他们是否在华为设备上使用了其他意图操作?

在此先感谢您的帮助。

【问题讨论】:

    标签: android android-intent huawei-mobile-services


    【解决方案1】:

    是的,在华为设备上,Nova 使用不同的意图打开到正确的屏幕。我可能通过在从华为设备中提取的 Settings.apk 上使用 apktool 并查看 AndroidManifest 发现了这一点。 请注意,“com.android”始终是代码异味,因为这意味着它不是公共 API 的一部分。这甚至不是真正的“com.android”,因为它在 AOSP 上不存在,com.android.settings.PREFERRED_SETTINGS 纯粹是华为的发明。一些华为设备很可能根本没有这个。也有可能在未来,这种意图可能会继续起作用,但不会像现在这样。所以要小心处理。

    /* Some Huawei devices don't let us reset normally, handle it by opening preferred apps */
    Intent preferredApps = new Intent("com.android.settings.PREFERRED_SETTINGS");
    preferredApps.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    if (pm.resolveActivity(preferredApps, 0) != null) {
        context.startActivity(preferredApps);
    } else {
        ...
    }
    

    【讨论】:

    • 几天前我也做了同样的事情!您还应该检查 Intent.FLAG_HW_HOME_INTENT_FROM_SYSTEM 值(使用反射)。如果它不是 0 且 API 级别为 21 或更高且 Build.BRAND 等于IgnoreCase "huawei",那么您可以“尝试”使用此“com.android.settings.PREFERRED_SETTINGS”意图。
    • 哈,是的,我看到你反编译了 Nova :P。您无需专门检查该标志,我只是将其用作可能的指标。通常,在检测 OEM 更改时,最好检测软件而不是硬件,而对常量进行反射是一种简单的方法。如果他们重构,那么原始问题很可能需要一个新的解决方法。顺便说一句,检查应该是标志是否存在, != 0 就是我的反射助手的工作方式。
    • 凯文,确实,我反编译了你的 Nova 应用程序并发现了这一点。非常感谢分享这个解释。非常感谢 Nova(代表整个世界):Nova 真的很棒!太棒了! (在我这边,我使用了不同的方法:我尝试为老年人提供一个简化版的 Android(elementique.com/fr/ok 英文版正在建设中)。这是一个自制的、艰难的项目,就像我正在做的那样一切都靠我自己)
    • 这将打开一般首选应用程序屏幕,而不是启动器选择屏幕。启动器选择是com.google.android.permissioncontroller/com.android.packageinstaller.role.ui.HomeSettingsActivity
    【解决方案2】:

    事实上,接受的答案并非 100% 正确,因为它会打开一个通用的默认应用选择器活动。

    它有效,但最好将用户权限带到启动器选择器活动 - 它是 com.google.android.permissioncontroller/com.android.packageinstaller.role.ui.HomeSettingsActivity(至少对于 Android 10 Huawei Honors)。

    所以,正确的代码 sn-p 是:

    Intent()
                .apply {
                    component = ComponentName("com.google.android.permissioncontroller", "com.android.packageinstaller.role.ui.HomeSettingsActivity")
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
                }
                .takeIf {
                    packageManager.resolveActivity(it, 0) != null
                }
                ?.let(context::startActivity)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多