【问题标题】:How distinguish hangout from google talk app?如何区分环聊和谷歌谈话应用程序?
【发布时间】: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())){
                      ......
                    }

【问题讨论】:

    标签: android hangout


    【解决方案1】:

    当 Google 开始运送在 ROM 部分中安装了环聊的设备时,检查安装路径的工作停止了。我猜最初的 Nexus 5 ROM 在 ROM 中包含了新的环聊应用程序。更多更新将安装在用户空间中。

    无论如何,检查权限android.permission.SEND_SMS 应该可以解决问题。 我没有任何可以测试旧 Google Talk 的设备。但我猜它没有这个权限。

    private boolean isHangoutsInstalled(final Context context) {
        PackageManager pm = context.getPackageManager();
        assert pm != null;
    
        // check for bable aka hangouts app 
        try {
            if (pm.getApplicationInfo("com.google.android.apps.babel", 0) != null) {
                return true;
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "babel not found, check for talk app");
        }
    
        // check for talk app or updated talk app now known as hangouts
        try {
            if (pm.getApplicationInfo("com.google.android.talk", 0) == null) {
                // no talk, no update
                return false;
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "talk app not found");
            // no talk, no update
            return false;
        }
    
        // talk app found
        // check for talk update
        return PackageManager.PERMISSION_GRANTED == pm
                .checkPermission("android.permission.SEND_SMS",
                                 "com.google.android.talk");
    }
    

    我不确定第一部分是否检查 com.google.android.apps.babel 包。
    我 N4 的环聊应用程序的解码 AndroidManifest.xml 显示 packageName="com.google.android.apps.babel"。但是PackageManager 会抛出NameNotFoundException
    也许你可以完全放弃第一部分。

    【讨论】:

    • 感谢您的回复。我认为你的解决方案比我的更好。但这仍然是一个非常微妙的时刻,需要对所有目标设备进行测试。
    【解决方案2】:

    您应该使用应用程序版本,Hangouts 是 2.0,gtalk 似乎是 2.1.33 的最后一个。

    看看:https://*.com/a/6593822/955143

    但你想使用类似的东西

    PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    version = pInfo.versionName;
    

    由于 Gtalk 不会进一步升级,您可以通过此方法进行中继以识别它,如果他们的环聊应用不是最后一个(或几个版本),另一种方法可以始终将您的用户发送到市场。

    缺点是您需要密切关注环聊更新,以调整您的代码以做出相应的反应。

    【讨论】:

    • 这场战争是我的第一个想法,但我无法系统化 Google Talk 的版本,因为如果设备预设了 Google Talk 应用,它的 versionName 类似于“YYYT-XXXXXX”,其中“YYYY” - 这个是 android 版本(如 4.0.4 或 4.1.2)。我没有在 Android 2.XX 上测试过,但这可能是个问题。
    • 所以只考虑破折号之后的部分。
    • gtalk 的版本可以是:“YYYY-XXXXXX”或只是“XXXXXX”,我不能 100% 确定设备上的版本。