Как я могу прослушать, какое приложение было выбрано в качестве приложения запуска? - PullRequest
0 голосов
/ 26 октября 2018

Я попытался реализовать функциональность, которая позволяет пользователю выбирать приложение запуска по умолчанию для 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, тогда я получу некоторыеобратный вызов, но приложение запуска не будет установлено вообще.Кроме того, в намерениях, полученных в 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
    }
}

Это приводит к выбору по умолчанию, без опций "JUST ONCE" или "ВСЕГДА".У меня нет точной картинки, но она выглядит примерно так:

enter image description here

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

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

С помощью 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))
            return@getPreferredLauncher components[i]
    }
    return null
}

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

0 голосов
/ 29 октября 2018

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

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);
...