【问题标题】:Call "select launcher" dialog when my app isn't the default launcher app当我的应用不是默认启动器应用时调用“选择启动器”对话框
【发布时间】:2016-08-30 07:15:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-launcher


    【解决方案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);
    

    效果很好,很高兴帕拉尼的回答。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多