从我的应用程序中,我要运行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/