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

Android 如何以编程方式设置默认应用程序启动器?,android,android-intent,launcher,Android,Android Intent,Launcher,我正在创建一个可以通过谷歌下载的launcher(kiosk)应用程序。首次安装此应用程序时,用户可以选择默认的启动器(地雷或库存)。如果用户没有将我的应用程序设置为默认启动程序,我将尝试手动启动。我希望当对话框出现时,用户被迫选择“始终”,而不是仅选择一次,否则对话框将继续定期显示友好消息。这就是我迄今为止所尝试的 我创建了一个方法来检查我的应用程序是否是默认的 /** * method checks to see if app is currently set as default lau

我正在创建一个可以通过谷歌下载的launcher(kiosk)应用程序。首次安装此应用程序时,用户可以选择默认的启动器(地雷或库存)。如果用户没有将我的应用程序设置为默认启动程序,我将尝试手动启动。我希望当对话框出现时,用户被迫选择“始终”,而不是仅选择一次,否则对话框将继续定期显示友好消息。这就是我迄今为止所尝试的

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

/**
 * 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;
}   
当我这么做的时候,我没有收到我的应用程序和股票启动器之间的选择。我试着使用
startActivity(Intent.createChooser(Intent,“请将启动器设置设置为始终”)
我可以在我的应用程序和股票启动器之间进行选择,但是,我不能总是或只获得一次选项

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

我希望当对话框出现时,用户被迫选择“始终”,而不是仅选择一次

这是不可能的,除非是在根设备上,除非安卓系统存在一些安全缺陷

当我这么做的时候,我没有收到我的应用程序和股票启动器之间的选择

对。如果已经选择了默认值,则只需启动默认值

我尝试使用startActivity(Intent.createChooser(Intent,“请将启动器设置设置为始终”);我可以在我的应用程序和股票启动器之间进行选择,但是,我不能总是或只获得一次选择


createChooser()
强制选择,但不允许设置默认值。

这实际上可以通过一些解决方法实现:

创建一个空的
活动
,作为名为
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>
此方法临时启用
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
。。。在你的日志中

然后,该方法只需打开一个launcher intent,您可以在其中看到所有已安装的launcher和按钮“始终”/“仅一次”。 最后,该方法再次禁用
FakeLauncherActivity
,以便它不会显示在列表中

您可以随时重复该操作,并且仅当您所需的启动器活动设置为默认值时,才允许用户继续操作。

由于某些原因,问题中的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;

如果您正在实施Google EMM解决方案(专用设备):


你不应该强迫用户做某事。让他们决定他们想要什么。如果用户想试用你的应用程序,但又想立即切换回来怎么办。内置的选择器就可以了。实际上这是启动程序应用的常见行为。下载任何为儿童构建的启动器应用程序,就是这样。原因实际上是保护用户(儿童)。这样做的目的是进一步确保儿童处于一个受控的环境中。这就是为什么大多数为儿童构建的launcher应用程序(如Famigo和其他)都有这种行为。是否可以在不向用户提示的情况下选择我们的应用程序,是否有一种方法为默认launcher指定包名?您所描述的是我所经历的,但这不是我从其他应用程序中注意到的。如果你从谷歌play商店下载Famigo应用程序,你就会明白我的意思。当Famigo不是默认应用程序时,会出现一个对话框,说明用户必须将该应用程序设置为默认应用程序,否则无法访问某些功能。你必须总是选择。一旦你们这样做了,当你们进入设备设置时,它会显示为默认启动程序,“为某些操作选择默认启动应用程序”。在Famigo应用程序中,您只需单击一个按钮,即可撤消此默认设置。@portfoliobuilder:然后,我会研究他们是如何做到这一点的,然后将安全漏洞报告给Google,并尝试修复该漏洞。您好,我已经安装了根设备。如何将我的启动器强制显示为默认启动器[没有任何弹出窗口,甚至用户按Home按钮]如何通过编程始终强制按下Wow!经过这么长时间,我终于找到了一个可行的答案!谢谢你,好先生!!您在哪个版本的Android中使用了此代码?我无法让它在4.4.2Alright中工作,这就是为什么每次用户打开或返回应用程序时,您都必须检查您的启动器是否为默认启动器(
isMyAppLauncherDefault()
)。我发现我的答案只是以下内容的副本:。。。所以请继续,请投那个。当我回答这里时,我不知道我的解决方案是从哪里来的,但现在我又找到了源代码。我正在开发launcher应用程序,但我面临着将默认launcher保留为我的launcher应用程序的挑战,即我将我的launcher设置为默认值,重新启动设备后,设备再次要求我设置默认launcher。请指导我,以便我能在我的项目中解决这个问题。提前感谢。如何获取adminName?@PriteshVishwakarma这里是文档:如果您想将另一个应用程序设置为启动器,请使用字符串构造ComponentName:
new ComponentName(“com.example.myotherapp”、“com.example.myotherapp.MainActivity”)
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
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;
// Create an intent filter to specify the Home category.
IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

// Set the activity as the preferred option for the device.
ComponentName activity = new ComponentName(context, KioskModeActivity.class);
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.addPersistentPreferredActivity(adminName, filter, activity);