所以我正在制作自定义应用选择器。它将安装浏览器,并安装任何地图应用程序。我得到以下各项:
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
。
有人可以帮忙吗?
感谢。
答案 0 :(得分:3)
我的问题是,当我只能获得List 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示例项目,该项目在一个充满ListView
个对象的适配器上有ResolveInfo
。
我认为如果不是更优越,您的解决方案将是等效的,但您需要使用activity.applicationInfo.packageName
来获取要使用的包。 resolvePackageName
不是您认为的那样。 : - )
答案 1 :(得分:3)
如果您想获取包名,请使用ResolveInfo
试试这个:
(ResolveInfo Object).activityInfo.packagename;
这将返回包名称的字符串。