如何以编程方式设置默认应用程序启动器?

我正在创build一个可以通过谷歌下载的启动器(kiosk)应用程序。 当第一次安装这个应用程序时,用户有能力select哪个启动器(我的或股票)是默认的。 如果用户没有将我的应用程序设置为默认启动器,我试图手动启动它。 当对话框出现时,我希望用户被迫selectALWAYS而不是JUST ONCE,否则对话框将继续以友好的信息定期出现。 这是我迄今为止所尝试的。

我创build了一个方法来检查我的应用程序是否是默认的

/** * 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; } 

然后,我尝试启动select器

 /** * 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); } 

当我这样做,我没有收到我的应用程序和股票发射之间的select。 我尝试使用startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); 我可以在我的应用程序和股票启动器之间做出select,但是,我没有得到select总是或只是一次。

我可以创build一个自定义对话框,而不是启动select器,但我需要知道如何以编程方式设置默认的应用程序启动器。 提前致谢!

Solutions Collecting From Web of "如何以编程方式设置默认应用程序启动器?"

这实际上可能有一个小的解决方法:

创build一个空的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() )。

如果没有,请提供用户select像这样的首选启动器活动:

 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 

…在你的日志里

然后,该方法只是打开一个启动器的意图,你可以看到所有已安装的发射器和button“总是”/“只是一次”。 最后,该方法再次禁用FakeLauncherActivity ,以便它不显示在列表中。

您可以随意重复该操作,只要您希望的启动器活动设置为默认值,就让用户继续。

我希望用户被迫select总是,而不是只有一次,当这个对话框出现

这是不可能的,除了可能在根植设备,除了一些Android的安全缺陷。

当我这样做,我没有收到我的应用程序和股票发射之间的select

正确。 如果已经select了一个默认值,这将只是启动默认值。

我尝试使用startActivity(Intent.createChooser(intent,“请设置启动器设置为ALWAYS”)); 我可以在我的应用程序和股票启动器之间做出select,但是,我没有得到select总是或只是一次。

正确。 createChooser()强制select,但不允许设置默认值。

问题中的isMyAppLauncherDefault()函数并不总是出于某种原因。 此代码可能会更好地确定什么是主屏幕的默认包。

 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;