【发布时间】:2026-01-06 17:45:01
【问题描述】:
我想在我的应用中运行Hangouts,用户可以通过该应用创建视频通话。
但在某些目标设备上,用户拥有原生 Google Talk 应用(未更新为环聊)。
问题是:Google Talk 和 Hangouts - 这是相同的应用程序,具有相同的包名称 com.google.android.talk,我不知道如何区分它们。
我的逻辑:当我在设备上找到包时 - 我只是运行 app.如果没有 - 使用此应用打开市场页面。
也许有人知道,如何区分 Hangout 和 google talk 应用程序?
我的代码:
public void startApplication(String packageName){
try
{
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info : resolveInfoList)
if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
{
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
return;
}
showInMarket(packageName);
}
catch (Exception e)
{
showInMarket(packageName);
}
}
private void launchComponent(String packageName, String name){
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setComponent(new ComponentName(packageName, name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private void showInMarket(String packageName){
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
UPD
现在我只有一个想法:检查publicSourceDir 是否为/system/app/Talk.apk - 如果“是” - 我们已经预设了“Google Talk”应用程序 - 但我认为这不是一个好的解决方案。
你怎么看?
String publicSourceDir = getPackageManager()
.getPackageInfo(info.activityInfo.packageName, 0).applicationInfo.publicSourceDir;
if(!publicSourceDir.toLowerCase().endsWith(GOOGLE_HANGOUT_SYSTEM_APK.toLowerCase())){
......
}
【问题讨论】: