呼叫"选择启动器"我的应用程序不是默认启动器应用程序时的对话框

时间:2016-05-04 17:50:12

标签: android android-launcher

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

我使用此行代码执行此操作:

getPackageManager().clearPackagePreferredActivities(getPackageName());

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

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

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

android: choose default launcher programatically

How to set default app launcher programmatically?

但是这一切都有效,它无法识别我的应用程序不是默认启动器。 但是当我按下主页按钮时,会出现选择启动器的对话框。 我想在再次启动我的应用程序时出现此对话框,而不按主页按钮。

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

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

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。 我用了这个答案:https://stackoverflow.com/a/7824190/2382100

我的代码看起来像这样:

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的回答。