Как программно запускать программу запуска приложений по умолчанию?

Я создаю приложение launcher (kiosk), которое будет загружаться через google. При первой установке этого приложения пользователь может выбрать, какой пусковой установщик (шахта или запас) будет по умолчанию. Я пытаюсь выполнить это вручную, если пользователь не делает мое приложение пусковой установкой по умолчанию. Я хочу, чтобы пользователь был вынужден выбирать ALWAYS вместо JUST ONCE, когда это диалоговое окно появляется, иначе диалог будет периодически появляться с дружеским сообщением. Это то, что я пытался сделать до сих пор.

Я создал метод проверки, если мое приложение по умолчанию

/** * method checks to see if app is currently set as default launcher * @return boolean true means currently set as default, otherwise false */ private boolean isMyAppLauncherDefault() { final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); filter.addCategory(Intent.CATEGORY_HOME); List<IntentFilter> filters = new ArrayList<IntentFilter>(); filters.add(filter); final String myPackageName = getPackageName(); List<ComponentName> activities = new ArrayList<ComponentName>(); final PackageManager packageManager = (PackageManager) getPackageManager(); packageManager.getPreferredActivities(filters, activities, null); for (ComponentName activity : activities) { if (myPackageName.equals(activity.getPackageName())) { return true; } } return false; } 

Затем я делаю попытку запуска выбора

 /** * method starts an intent that will bring up a prompt for the user * to select their default launcher. It comes up each time it is * detected that our app is not the default launcher */ private void launchAppChooser() { Log.d(TAG, "launchAppChooser()"); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 

Когда я это делаю, я не получаю выбор между моим приложением и пусковой установкой. Я попробовал использовать startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); И я получаю выбор между моим приложением и пусковой установкой, однако, я не получаю варианты ВСЕГДА или ТОЛЬКО ОДИН РАЗ.

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

Solutions Collecting From Web of "Как программно запускать программу запуска приложений по умолчанию?"

Это действительно возможно с небольшим обходным решением:

Создайте пустую Activity которая действует как пусковая установка под названием FakeLauncherActivity . Добавьте его в манифест в качестве отключенного компонента:

 <activity android:name="com.path.to.your.FakeLauncherActivity" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Проверьте, является ли ваша требуемая активность запуска стандартной по умолчанию (с isMyAppLauncherDefault() из вашего вопроса).

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

 public static void resetPreferredLauncherAndOpenChooser(Context context) { PackageManager packageManager = context.getPackageManager(); ComponentName componentName = new ComponentName(context, com.path.to.your.FakeLauncherActivity.class); packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); Intent selector = new Intent(Intent.ACTION_MAIN); selector.addCategory(Intent.CATEGORY_HOME); selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(selector); packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP); } 

Этот метод временно позволяет FakeLauncherActivity , что приводит к изменению набора доступных действий запуска, что заставляет Android забыть о своей стандартной пусковой установке. Вы увидите что-то вроде …

 521-735/system_process I/PackageManager﹕ Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 } type null 

… в вашем журнале.

Затем метод просто открывает план запуска, где вы можете видеть все установленные пусковые установки и кнопки «Всегда» / «Только один раз». Наконец, этот метод снова отключает FakeLauncherActivity чтобы он не отображался в списке.

Вы можете повторить это так часто, как вы хотите, и только разрешите пользователю действовать, если ваша целевая активность запуска установлена ​​по умолчанию.

Я хочу, чтобы пользователь был вынужден выбирать ALWAYS вместо JUST ONCE, когда этот диалог появляется

Это невозможно, за исключением, возможно, на корневых устройствах, запрещающих некоторые нарушения безопасности в Android.

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

Верный. Если значение по умолчанию уже выбрано, это просто запустит значение по умолчанию.

Я попробовал использовать startActivity (Intent.createChooser (намерение, «Пожалуйста, установите параметры запуска во ВСЕГДА»)); И я получаю выбор между моим приложением и пусковой установкой, однако, я не получаю варианты ВСЕГДА или ТОЛЬКО ОДИН РАЗ.

Верный. createChooser() заставляет выбирать, но не позволяет установить значение по умолчанию.

Функция isMyAppLauncherDefault () в вопросе не всегда работает по какой-то причине. Этот код может быть лучше для определения того, что представляет собой пакет по умолчанию для экрана HOME.

 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); String currentHomePackage = resolveInfo.activityInfo.packageName;