如何区分环聊和Google Talk应用?

时间:2013-11-28 13:06:57

标签: android hangout

在我的应用中,我想运行Hangouts,用户可以通过该应用创建视频通话。
但在某些目标设备上,用户拥有原生Google Talk应用(未更新为环聊)。

问题是:Google Talk和环聊 - 这是具有相同包名com.google.android.talk的相同应用,我不知道如何区分它们。

我的逻辑:当我在设备上找到包时 - 我只是运行app。如果没有 - 使用此应用程序打开市场页面。

也许有人知道,如何将视频群聊与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())){
                      ......
                    }

2 个答案:

答案 0 :(得分:4)

检查安装路径是否已停止工作,当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 也许你可以完全放弃第一部分。

答案 1 :(得分:0)

你应该使用app版本,Hangouts是2.0,2.1.33中的gtalk似乎是最后一个。

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

但是你想要使用像

这样的东西
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pInfo.versionName;

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

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