Android:两个应用程序具有相同的包名。如何区分它们?

3
我正在尝试使用以下方法获取我设备中所有可启动的应用程序:
apps = new ArrayList<>();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> availableActivities = manager.queryIntentActivities(intent, 0);
for(ResolveInfo ri:availableActivities){
    AppDetail app = new AppDetail();
    app.label = ri.loadLabel(manager);
    app.name = ri.activityInfo.packageName;
    app.icon = ri.activityInfo.loadIcon(manager);
    apps.add(app);
}

我尝试打印这些应用程序的标签和包名,发现如下信息:
联系人 com.sonyericsson.android.socialphonebook
电话 com.sonyericsson.android.socialphonebook
它们具有不同的应用程序标签,但是相同的包名。当我尝试打开这些应用程序时,它们都打开了联系人应用程序。 有没有办法区分它们?或者我使用了错误的方法来获取应用程序列表?

你不能安装两个同名的应用程序。如果尝试这样做,它们会发生冲突,第二个应用程序的安装将失败或覆盖原始应用程序。在这里看到的是同一个应用程序中设置为可启动的两个不同活动,这是完全合法的。您可以在启动器中拥有任意多个列表。 - Gabe Sechan
1个回答

2

queryIntentActivities检索所有可以执行给定intent的活动。因此,它可以返回具有相同包名称的活动信息。

我相信电话和联系人是相同的联系人应用程序。

同一程序可以创建两个不同的图标,每个图标对应不同的活动。这是有意义的,因为MAIN/LAUNCHER intent filter基本上告诉android该活动是应用程序的启动活动。因此,如果将此过滤器添加到两个活动中,它将为您提供同一应用程序的两个图标以进入不同的活动。Android的意图过滤器模型中没有强制要求每个应用程序只有一个启动活动。


是的,你说得对。经过进一步的检查,我注意到它们实际上是同一个应用程序。这引发了另一个问题。我如何从包名获取手机应用程序的标签和图标?我应该提出另一个问题,还是在这里问可以吗? - AhmadF
很高兴你解决了它。但我认为这并不常见! - Rainmaker

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