如何在Android 2.3及以上版本中获取当前启动器的软件包名称?

31

如何通过Java编程,在Android 2.3及以上版本中,程序化地获取当前启动器的包名?


3
那不仅仅只是给出当前应用程序的包名吗? - HardCoder
3个回答

68

我认为你可以使用PackageManager.resolveActivity()方法,并使用主屏幕意图。

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;

4
如果没有选择"默认"启动器,它就会返回 "android"。虽然不常见,但确实会发生。 - Amir Uval
1
请注意,如果没有匹配项,它将返回 NULL,并且您将在最后一行获得 NPE! - JacksOnF1re
2
是的,这是说明性代码,用于说明解决方案,不应直接用于“生产”使用。此外,如果您的手机没有主屏幕应用程序...那么您可能还有其他问题 :) - JesusFreke
1
对于任何想在 Android 11+ 设备上运行此答案中的代码块的人,请参阅我的答案这里,了解您应该考虑的 Android 11 包可见性更改。 - Adil Hussain

3
在Android 11中引入了包可见性更改,现在需要在应用程序清单文件中添加一个查询元素,如下所示,才能查询已安装在设备上的默认主页(也称为启动器)活动的PackageManager.resolveActivity(intent:flags:)方法。请保留HTML标签。
<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:)方法的指导,请参阅此线程中的已接受答案

-2

一般来说,我同意@JesusFreke使用PM resolveActivity

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);

但是要获取正确的包名,您应该使用

resolveInfo.loadLabel(packageManager).toString()

或者

resolveInfo.activityInfo.applicationInfo.loadLabel(packageManager).toString()

提示: 如果没有默认设置,这可能会变成“Android系统”或“open”,适用于一般的系统意图接收器。

提示: 如果您正在寻找网络浏览器,您可以使用net.openid.appauth.browser.BrowserSelector#select()0.7.1+)来隐式获取默认浏览器,即使没有明确设置。


这是应用程序的可读名称,而不是包名称。 - JesusFreke

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