android – 如何区分谷歌谈话应用程序的环聊?

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

问题是:Google Talk和环聊 – 这是与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);
            ListnoreCase(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())){
                      ......
                    }
最佳答案
当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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...