Android - 如何获取动态意图的包详细信息

时间:2011-08-31 15:46:59

标签: android android-intent

所以我正在制作自定义应用选择器。它将安装浏览器,并安装任何地图应用程序。我得到以下各项:

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

有人可以帮忙吗?

感谢。

2 个答案:

答案 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;

这将返回包名称的字符串。