所以我正在制作一个自定义应用程序选择器。它将安装浏览器和所有地图应用程序。我得到每一个如下:
PackageManager packageManager = activity.getPackageManager();
//This gets all the browsers
String browserURI = "http://"+Driver.getIamhereURL()+lat+","+lon;
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(browserURI));
List<ResolveInfo> browserList = packageManager.queryIntentActivities(browserIntent, 0);
// This gets all the Map apps:
String mapUri = "geo:"+lat+","+lon;
Intent mapIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mapUri));
List<ResolveInfo> mapList = packageManager.queryIntentActivities(mapIntent, 0);
//Combine the two
browserList.addAll(mapList);
//Now build layout and return a LinearLayout
LinearLayout appListBody = buildAppList(browserList,packageManager);
appListBody
将包含应用图标和应用名称。显然,每个应用程序都必须有一个与之关联的onClickListener()
,这将启动intent
。我的问题是,我如何发送intent
到我的方法,当所有我能得到的是List<ResolveInfo> listOfApps
?
我可以尝试for
循环,然后去pm.getLaunchIntentForPackage(listOfApps.get(count).resolvePackageName)
,但然后我得到NullPointerException: package name is null
。
有人能帮忙吗?
谢谢。
使用ResolveInfo
,如果你想获得包名,试试这个:
(ResolveInfo Object).activityInfo.packagename;
这将返回一个包名字符串。
我的问题是,我如何发送意图到我的方法,当所有我能得到的是listOfApps?
你可以自己构造一个合适的Intent
:
@Override
protected void onListItemClick(ListView l, View v,
int position, long id) {
ResolveInfo launchable=adapter.getItem(position);
ActivityInfo activity=launchable.activityInfo;
ComponentName name=new ComponentName(activity.applicationInfo.packageName,
activity.name);
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
}
这是来自我的Launchalot示例项目,它在一个充满ResolveInfo
对象的适配器上有一个ListView
。
我认为你的解决方案即使不是更优,也是等价的,但是你需要使用activity.applicationInfo.packageName
来使用这个包。resolvePackageName
不是你想的那样。: -)