2011-08-31 98 views
0

因此,我正在製作自定義應用選擇器。它將安裝瀏覽器,並安裝任何地圖應用程序。我得到的每一項如下:Android - 如何獲取動態意圖的包詳細信息

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

任何人都可以幫忙嗎?

謝謝。

回答

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示例項目,其中有一個適配器的全ResolveInfo對象上ListView

我會認爲你的解決方案如果不是優越的,將是等效的,但你需要使用activity.applicationInfo.packageName來獲得使用的軟件包。 resolvePackageName是不是你認爲它是。 :-)

+0

啊我明白了!我正在使用'resolvePackageName'。在那個筆記上,我是否使用了獲取圖標的正確方法?因爲沒有人出現。我也嘗試過'appImage.setImageResource(listOfApps.get(count).activityInfo.icon);'但仍然沒有顯示圖標。 – eoinzy

+1

@eoinzy:我在'ResolveInfo'對象上使用'loadIcon()'。 – CommonsWare

+0

很酷。我設法通過使用'appImage.setImageDrawable(pm.getApplicationIcon(listOfApps.get(count).activityInfo.packageName))''得到它。謝謝。 – eoinzy

3

使用ResolveInfo如果你想獲得包名試試這個:

(ResolveInfo Object).activityInfo.packagename; 

這將返回包名稱的字符串。

+0

幫助我!因爲resolveInfo.resolvePackageName始終返回null! – ThunderWiring