从我的应用程序中,我要运行Hangouts,用户可以从该应用程序中创建视频通话。但是在某些目标设备上,用户具有 native Google Talk应用(未更新为环聊)。

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

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

也许有人知道,如何将环聊与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-如果为"is",我们已经预设了“Google Talk”应用程序-但我认为这不是一个好的解决方案。您对此有何看法?
String publicSourceDir = getPackageManager()
                            .getPackageInfo(info.activityInfo.packageName, 0).applicationInfo.publicSourceDir;
if(!publicSourceDir.toLowerCase().endsWith(GOOGLE_HANGOUT_SYSTEM_APK.toLowerCase())){
                      ......
                    }

最佳答案

当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
也许您可以完全删除第一部分。

关于android - 如何区分Hangouts与Google Talk应用程式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20267040/

10-14 17:27
查看更多