如何在 android 2.3 及更高版本中获取当前启动器的包名?

Posted

技术标签:

【中文标题】如何在 android 2.3 及更高版本中获取当前启动器的包名?【英文标题】:How can I get the package name of the current launcher in android 2.3 and above? 【发布时间】:2012-05-07 20:36:50 【问题描述】:

如何在 Java 中以编程方式获取 android 2.3 及更高版本中当前启动器的包名称?

【问题讨论】:

不是只给出当前应用的包名吗? 【参考方案1】:

我认为您应该能够使用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;

【讨论】:

如果没有选择“默认”启动器,它只返回“android”。这不是常见的情况,但它确实发生了。 请注意,如果没有匹配,它将返回 NULL,并且您将在最后一行得到 NPE! 是的,这是说明解决方案的说明性代码,不应按原样用于“生产”用途。此外,如果您的手机没有家庭应用程序...您可能还有其他问题:) 对于想要在 Android 11+ 设备上运行此答案中的代码块的任何人,请参阅我的答案 here 关于您应该考虑的 Android 11 包可见性更改。【参考方案2】:

使用 Android 11 中引入的 package visibility changes,现在需要在应用程序的清单文件中添加一个 queries 元素,如下所示,然后才能查询默认主页(又名启动器)活动的 PackageManager.resolveActivity(intent:flags:) 方法安装在设备上,如该线程中的accepted answer 所述:

<queries>
    <intent>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
    </intent>
</queries>

如果您的应用程序清单中省略了此 queries 元素,则设备会将 com.android.settings.FallbackHome 活动报告为其默认主页活动,这很可能不是您想要的。

【讨论】:

【参考方案3】:

一般来说,I agree to @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 System”或“open”,就像一般的 System Intent Receiver 一样

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

【讨论】:

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

以上是关于如何在 android 2.3 及更高版本中获取当前启动器的包名?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 9 及更高版本中,如何获取周围所有基站的 CID 和信号强度?

您如何以编程方式在 Android ICS 及更高版本上截取屏幕截图?

如何使用 Target API 23 及更高版本通过 GPS 获取用户位置

Xamarin Forms Android 10 及更高版本在公共外部存储中按文件名查找视频并获取路径

如何检查我是不是在 android 4.4 及更高版本中以编程方式打开了 gps? [复制]

如何以编程方式在 Android(KitKat 及更高版本)中添加 APN