当我的应用不是默认启动器应用时调用 "select launcher" 对话框

Call "select launcher" dialog when my app isn't the default launcher app

我正在做一个应用程序,它是我设备的默认启动器,经过大量搜索后我发现无法以编程方式将我的应用程序定义为默认启动器。 所以我决定执行以下操作,我将启用管理员用户将此应用程序设置为默认设置,并且此管理员将成为安装该应用程序并在将设备交给其他用户之前首次配置它的人。 退出应用程序的唯一方法是按后退按钮,当用户按下它时会出现一个对话框要求输入密码,如果输入的密码正确,应用程序将被删除作为默认启动器

我用这行代码来做到这一点:

getPackageManager().clearPackagePreferredActivities(getPackageName());

这很好用,我可以正常返回设备的主屏幕,我想要的是,当用户退出应用程序并返回时,我想验证该应用程序是否是默认启动器,并且如果不是,请显示 "select launcher" 对话框以选择它作为默认值。

我已经尝试了所有这些选项:

Android home-screen/launcher chooser does not show 'use by default for this action' option

android: choose default launcher programatically

但是所有这些都有效,它无法识别我的应用程序不是更多的默认启动器。 但是当我按下主页按钮时,会出现 select 启动器的对话框。 我希望在再次启动我的应用程序时出现此对话框,而无需按主页按钮。

这是我用来查找是否是我的默认启动器的方法:

private boolean isMyLauncherDefault() {
    final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
    filter.addCategory(Intent.CATEGORY_HOME);

    List<IntentFilter> filters = new ArrayList<>();
    filters.add(filter);

    final String myPackageName = getPackageName();
    List<ComponentName> activities = new ArrayList<>();
    PackageManager packageManager = getPackageManager();

    // You can use name of your package here as third argument
    packageManager.getPreferredActivities(filters, activities, null);


    if(activities.size() == 0) //no default
        return true;

    for (ComponentName activity : activities) {
        if (myPackageName.equals(activity.getPackageName())) {
            return true;
        }
    }
    return false;
}

当我在调试时查看活动数组时,我的应用程序仍然存在,但我怎么说,android 知道我的应用程序不是默认的。我也需要这个方法来识别这个。

下面的方法假设再次调用对话框:

public static void resetPreferredLauncherAndOpenChooser(Context context) {
    PackageManager packageManager = context.getPackageManager();
    packageManager.clearPackagePreferredActivities(context.getPackageName());
    ComponentName componentName = new ComponentName(context, VideoActivity.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);
}

所有这些方法都来自以前的链接。

如果有人能帮助我,我将不胜感激。

PS: 我正在使用 sdk 目标版本 21

我找到了解决方案。 我使用了这个答案:

我的代码是这样的:

ComponentName componentName = new ComponentName(this, VideoActivity.class);
getPackageManager().setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, PackageManager.DONT_KILL_APP);

这将禁用我的应用程序,但如果我理解得很好,它仍将是默认启动器但已禁用,并且它将返回主屏幕,返回主屏幕后,如果用户再次打开它,则代码将执行此操作:

Log.d(TAG, "Recreating launcher");
PackageManager packageManager = context.getPackageManager();
packageManager.clearPackagePreferredActivities(context.getPackageName());
ComponentName componentName = new ComponentName(context,VideoActivity.class);
packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);

效果很好,很高兴 Palani 的回答。