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