5

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

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

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

也许有人知道,如何区分环聊和谷歌谈话应用程序?

我的代码:

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())){
                      ......
                    }
4

2 回答 2

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.
也许你可以完全放弃第一部分。

于 2013-12-04T03:50:38.847 回答
0

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

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

但是你想使用类似的东西

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

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

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

于 2013-12-02T13:28:41.703 回答