我想从我的Activity
启动另一个应用程序Activity
,但是我拥有的所有信息都只是该应用程序包的名称。我做了以下事情:
Intent intent = new Intent();
intent.setPackage(anotherApplicationPackageName);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
据我所知,使用此API,Android会查找Activity
,它可以处理给定包中的Intent
,但我总是得到ActivityNotFoundException
。
问题是我做错了什么?
答案 0 :(得分:8)
PackageManager pmi = getPackageManager();
Intent intent = null;
intent = pmi.getLaunchIntentForPackage(packageNameToLaunch);
if (intent != null){
startActivity(intent);
}
答案 1 :(得分:1)
您必须使用“Intent.CATEGORY_DEFAULT”类别声明另一个活动的intent过滤器并创建自定义操作并使用该类别和操作调用它,在intent中设置包只会缩小其范围。
答案 2 :(得分:0)
Intent.ACTION_SEND
我遇到了类似的问题。可能这段代码对某人有用:
/** Knowing intent and package name, set the component name */
public static Intent setComponentByPackageName(Context context, String packageName, Intent intent0) {
Intent intent = new Intent(intent0);
if (null == intent.getType()) {
intent.setType("text/plain");
}
PackageManager pm = context.getPackageManager();
List<ResolveInfo> rList = pm.queryIntentActivities(intent, 0);
// possible flags:
// PackageManager.MATCH_DEFAULT_ONLY PackageManager.GET_RESOLVED_FILTER
for (ResolveInfo ri : rList) {
if (packageName.equals(ri.activityInfo.packageName)) {
intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
return intent;
}
}
return null;
}
在尝试使其工作(ResolveInfo列表为空)的过程中,我发现缺少 setType()(您不需要 setType() 和 setPackage()如果 setComponent()),那么实际上以下就足够了:
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.setPackage("com.xxxxxx");
// ...
intent.putExtra(Intent.EXTRA_TEXT, text);
// ...
startActivityForResult(intent, ...);