Как я могу прослушать, какое приложение было выбрано в качестве Launcher Application?

Я попытался реализовать функциональность, которая позволяет пользователю выбирать приложение запуска по умолчанию для Android по умолчанию. Также мне нужно получить информацию, какое приложение было выбрано. Но есть проблема с этим подходом.

Чтобы позволить пользователю выбрать Launcher Application, мы можем просто запустить заданное намерение:

val selector = Intent(Intent.ACTION_MAIN)
selector.addCategory(Intent.CATEGORY_HOME)
selector.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(selector)

Это приводит к такому диалогу:

enter image description here

То, что я заметил, если я использую startActivity, приложение Launcher настроено красиво и работает как задумано, но если я использую startActivityForResult, я получу некоторый обратный вызов, но приложение Launcher не будет установлено вообще. Также не было ничего интересного в намерениях, полученных в onActivityResult.

Затем я попытался использовать IntentSender.

Код выглядит следующим образом:

val selector = Intent(Intent.ACTION_MAIN)
selector.addCategory(Intent.CATEGORY_HOME)
selector.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val receiver = Intent(this, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT)
val chooser = Intent.createChooser(selector, "Select a Home app", pendingIntent.intentSender);
startActivity(chooser)

Приемник выглядит следующим образом:

class MyBroadcastReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val componentName = intent.extras.getParcelable<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT)
        //com.example.myapp if my app was choosen
        val pkg = componentName.packageName
    }
}

Это приводит к выбору по умолчанию, без параметров "ТОЛЬКО ОДИН РАЗ" или "ВСЕГДА". У меня нет точной картины, но она выглядит примерно так:

enter image description here

Это работает таким образом, что в методе приемника onReceive я получаю объект ComponenName, который содержит выбранное приложение packageName. Проблема - снова - Приложение запуска не установлено!

Итак, вопрос: как я могу позволить пользователю устанавливать приложение запуска, а также получать информацию, какую он выбрал?

Ответы

Ответ 1

Попробуйте использовать следующий код:

PackageManager localPackageManager = getPackageManager();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
String launcherName = localPackageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName;
Log.e("Current launcher Package Name:",launcherName);

Ответ 2

С , java.util.List, java.lang.String) rel=noreferrer> getPreferredActivities() вы можете получить все действия, которые предпочитает пользователь. Это должно включать и пусковую установку.

Затем вы можете попытаться реализовать функцию getPreferredLauncher() чтобы получить текущий Launcher. Но, поскольку нет возможности прослушать это изменение, вам придется предварительно запрашивать его в Service или всякий раз, когда вы предполагаете, что данные могли измениться:

fun PackageManager.getPreferredLauncher(): ComponentName? {
    val filters = mutableListOf<IntentFilter>()
    val components = mutableListOf<ComponentName>()
    getPreferredActivities(filters, components, null)
    filters.forEachIndexed { (i, it) ->
        if (it.hasAction(ACTION_MAIN) && it.hasCategory(CATEGORY_LAUNCHER))
            [email protected] components[i]
    }
    return null
}

Пожалуйста, считайте этот код только черновым, поскольку у меня не было никаких настроек для его запуска.