Подтвердить что ты не робот

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

Я создаю приложение 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"));, и я получаю выбор между моим приложением и пусковой установкой, однако я не получаю опции ВСЕГДА или ТОЛЬКО ОДИН РАЗ.

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

4b9b3361

Ответ 1

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

Создайте пустой 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, чтобы он не отображался в списке.

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

Ответ 2

Функция 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;

Ответ 3

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

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

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

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

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

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

Ответ 4

Если вы внедряете решение Google EMM (выделенное устройство):

https://developer.android.com/work/dpc/dedicated-devices/cookbook

// Create an intent filter to specify the Home category.
IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

// Set the activity as the preferred option for the device.
ComponentName activity = new ComponentName(context, KioskModeActivity.class);
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.addPersistentPreferredActivity(adminName, filter, activity);