如何获取动态意图的包细节?



所以我正在制作一个自定义应用程序选择器。它将安装浏览器和所有地图应用程序。我得到每一个如下:

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不是你想的那样。: -)

最新更新