Установить Android Launcher по умолчанию на устройствах Huawei?

Моя цель состоит в том, чтобы установить мое приложение как средство запуска по умолчанию на устройствах Huawei.

1 - Пояснения:

1.1 - Текущая ситуация:

Я уже могу:

  • Проверьте, является ли мое приложение средством запуска по умолчанию
  • Отобразите "средство запуска" (с выбором "использовать один раз" / "всегда")

Это все работает нормально.. кроме как на устройствах Huawei!

С моей точки зрения, Android-версия Huawei должным образом не соблюдает договор о намерениях 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);

Таким образом, пользователь может перемещаться оттуда, нажимая эту последовательность пунктов меню:

  • -> Расширенные параметры (расширяемый пункт меню: отсутствует на планшете и не уверен, что присутствует на телефоне)
  • -> Приложения по умолчанию
  • -> Launcher по умолчанию

Это требует 2 или 3 шагов, которые я хотел бы избежать.

1.2 - это можно улучшить!

Я обнаружил, что при выборе пункта меню "-> Приложения по умолчанию" запускается (com.android.settings,.SubSettings) Intent (с дополнительным), но я не смог заставить это работать (отказ в разрешении).

Но я установил Nova Launcher, и оказалось, что он может отображать страницу настроек "-> Приложения по умолчанию" на устройствах Huawei!
Таким образом, пользователь попадает на страницу, где ему / ей нужно только нажать "-> Панель запуска по умолчанию", а затем выбрать панель запуска по умолчанию: гораздо проще.

2 - Вопросы:

Поскольку я думаю, что просто невозможно отобразить "Lancher Picker" на устройствах Huawei, вот мой вопрос:
Как отобразить страницу настроек "-> Приложения по умолчанию" (изображение здесь) на устройствах Huawei (как это делает Nova Launcher)?
Они используют другое намеренное действие на устройствах Huawei?

Заранее спасибо за вашу помощь.

1 ответ

Решение

Да, на устройствах Huawei Nova использует другое намерение открыть правильный экран. Я, вероятно, обнаружил это, используя apktool в файле Settings.apk, извлеченном из устройства Huawei и просмотрев AndroidManifest. Обратите внимание, что "com.android" всегда является запахом кода, поскольку это означает, что он не является частью общедоступного API. Кроме того, это даже не "com.android", так как он не существует в AOSP и com.android.settings.PREFERRED_SETTINGS это чисто изобретение Huawei. Весьма вероятно, что некоторые устройства Huawei не будут иметь этого вообще. Также возможно, что в будущем это намерение может продолжать работать, но не делать то, что оно делает в настоящее время. Так что обращайтесь с этим осторожно.

/* 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 {
    ...
}

Фактически, принятый ответ не является на 100% правильным, потому что он открывает общее действие выбора приложений по умолчанию.

Это работает, но лучше привести пользователя прямо к активности выбора пусковой установки - это com.google.android.permissioncontroller/com.android.packageinstaller.role.ui.HomeSettingsActivity (по крайней мере, для Android 10 Huawei Honors).

Итак, правильный фрагмент кода:

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)
Другие вопросы по тегам