从我的应用程序我想运行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.
也许你可以完全放弃第一部分.