如何在安卓系统中获取当前启动器的包名?

16

我想获取我当前安装的启动器的包名。我尝试使用链接https://dev59.com/l2kv5IYBdhLWcg3wxz2A,但是它返回的结果是"android"。我需要完整的启动器名称。

启动器列表

我想获取已安装的启动器列表以及当前选择的启动器。

提前致谢。


不需要包名,只需要创建一个隐式意图而不是显式意图。 - Stephan Branczyk
@StephanBranczyk 请详细阐述您的答案。 - Nishant Virmani
在你编辑帖子之前,我正在回复你的帖子。你是想制作自己的启动器吗?还是想制作自己的启动器选择器?你的最终目标是什么? - Stephan Branczyk
@StephanBranczyk 我的最终目标是只有在我的主屏幕时才启动特定服务。可能已安装任何第三方启动器。 - Nishant Virmani
5个回答

30

您可以使用以下代码获取当前的启动器包名称:

PackageManager localPackageManager = getPackageManager();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
String str = localPackageManager
        .resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)
        .activityInfo
        .packageName;
Log.e("Current launcher Package Name:", str);

简短而简洁。谢谢。 - dazed
它可以工作,但在一加设备上按Home键时无法获取启动器包名称。 - Makvin

2

获取Android中每个启动器的列表问题中,Fede的回答如下:

获取所有已安装启动器的列表。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> lst = getPackageManager().queryIntentActivities(intent, 0);
if (!lst.isEmpty()) {
   for (ResolveInfo resolveInfo : lst) {
        Log.d("Test", "New Launcher Found: " + resolveInfo.activityInfo.packageName);
   }
}

这并不确保第一个结果是当前正在使用的(因为问题明确要求),实际上也没有尝试确定正在使用的结果。 - Abandoned Cart

2

以下代码可以完美地获取当前启动器应用程序包名称。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
String currentLauncherName= resolveInfo.activityInfo.packageName;
Log.d("Current Launcher: ", currentLauncherName);

1
你可以这样获取它:
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
val resolveInfo: ResolveInfo = context.packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)?: return null
val currentLauncherPackageName: String = resolveInfo.activityInfo.packageName
val currentLauncherClassName: String = resolveInfo.activityInfo.name

两个边界情况:

结果1:安卓(当系统有多个启动器应用程序,但用户未进行默认选择时发生)

结果2:相应的包名。


1
在Android 11中引入了包可见性更改,现在必须在应用程序的清单文件中添加如下查询元素,然后才能查询已安装在设备上的主页(即启动器)活动的PackageManager.resolveActivity(intent:flags :)PackageManager.queryIntentActivities(intent:flags :)等方法之一:
<queries>
    <intent>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
    </intent>
</queries>

如果在您的应用程序清单中省略了这个 queries 元素,那么设备将报告 com.android.settings.FallbackHome 活动作为设备上唯一安装的主页活动。
有关如何调用 PackageManager.resolveActivity(intent:flags:)PackageManager.queryIntentActivities(intent:flags:) 等方法的指导,请参见本主题中的其他答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接