2013-12-18 22 views
2

我在做一個需要每個應用程序的高分辨率圖標的應用程序。如何使用PacakageManager找到高分辨率圖標

自從今天上午我做了一些研究,但沒有找到工作的答案。

這裏有兩個,我有什麼不對。

ActivityInfo info = packageManager.getActivityInfo(componentName,  PackageManager.GET_META_DATA); 

Resources resources; 
try { 
    resources = mPackageManager.getResourcesForApplication(
     info.applicationInfo); 
} catch (PackageManager.NameNotFoundException e) { 
resources = null; 
} 

if (resources != null) { 
int iconId = info.getIconResource(); 
if (iconId != 0) { 
    Drawable d; 
    try { 
     d = resources.getDrawableForDensity(iconId, DisplayMetrics.DENSITY_XHIGH); 
    } catch (Resources.NotFoundException e) { 
     d = null; 
    } 
    return d; 
} 
} 

僅供參考,我已經檢索到所有從packagemanager 「packageinfo」,我

1.使用getDrawableForDensity找到我需要的一切,但高分辨率圖標...

我這個問題是我不明白爲componentName放什麼。我如何用我從packagemanager獲得的信息「構建」它?

2.其他溶液 Retrieving xhdpi app icons from packageManager?

// Get the application's resources 
Resources res = mPackageManager.getResourcesForApplication(appInfo); 

// Get a copy of the configuration, and set it to the desired resolution 
Configuration config = res.getConfiguration(); 
Configuration originalConfig = new Configuration(config); 
config.densityDpi = DisplayMetrics.DENSITY_XHIGH; 

// Update the configuration with the desired resolution 
DisplayMetrics dm = res.getDisplayMetrics(); 
res.updateConfiguration(config, dm); 

// Grab the app icon 
Drawable appIcon = res.getDrawable(appInfo.icon); 

// Set our configuration back to what it was 
res.updateConfiguration(originalConfig, dm); 

爲這一個我有此線的一個問題:

繪製對象APPICON = res.getDrawable(appInfo.icon);

錯誤我得到「圖標」:

圖標不能得到解決或無法在現場

+0

您的解決方案「2」化險爲夷我們。謝謝。 –

回答

1

試試這個,這是類似於你的代碼,但它似乎爲我工作:

//獲取高分辨率圖標

   Drawable appIcon; 
List<Application> applications = new ArrayList<Application>(); 
     for (ApplicationInfo item : getInstalledApplications(packageManager)) { 

      try { 
       Resources resourcesForApplication = packageManager.getResourcesForApplication(item); 
       Configuration config = resourcesForApplication.getConfiguration(); 
       Configuration originalConfig = new Configuration(config); 

       DisplayMetrics displayMetrics = resourcesForApplication.getDisplayMetrics(); 
       DisplayMetrics originalDisplayMetrics = resourcesForApplication.getDisplayMetrics(); 
       displayMetrics.densityDpi = DisplayMetrics.DENSITY_DEFAULT; 
       resourcesForApplication.updateConfiguration(config, displayMetrics); 

       appIcon = resourcesForApplication.getDrawable(item.icon); 
       resourcesForApplication.updateConfiguration(originalConfig, originalDisplayMetrics); 
      } catch (PackageManager.NameNotFoundException e) { 
       Log.e("check", "error getting Hi Res Icon :", e); 
       appIcon = item.loadIcon(packageManager); 
      } 

      Application app = new Application(); 
      app.setTitle(item.loadLabel(packageManager).toString()); 
      app.setPackageName(item.packageName); 
      // app.setImage(item.loadIcon(packageManager)); 
      app.setImage(appIcon); 
      applications.add(app); 
      } 
    } 
1

這僅僅是猜測,因爲我不是一個特別好的Android的程序員,但: 在第一種解決方案,您可能可以通過PackageManager類的方法getInstalledApplications(int flags)檢索設備上安裝的每個應用程序的列表。 見 http://developer.android.com/reference/android/content/pm/PackageManager.html#getInstalledApplications(int)

所以,作爲一個代碼是這樣的:

///This retrieves information on every application installed on device, see documentation 
///for flags 
List<ApplicationInfo> applications = mPackageManager.getInstalledApplications(int flags); 
///Then retrieve Resources for every application with looping through all the applications 
for (ApplicationInfo info : applications) { 
Resources res = mPackageManager.getResourcesForApplication(info); 
///And now you can do what you already wrote yourself and try fetching icon for every 
///'res' you did in the first solution. 
} 

這是假設你要顯示的每個應用程序。

關於解決方案2: 我假設appInfo是'ApplicationInfo'類。它有一個從'PackageItemInfo'類繼承的公共字段「圖標」。確保你的appInfo是'PackageItemInfo'類的任何子類,它應該工作。如果它不起作用,則給定應用程序的Android manifest.xml可能有問題,並且無法檢索所需的整數。

您可以嘗試通過'PackageManager'類的'getApplicationIcon'方法檢索圖標。再次

List<ApplicationInfo> applications = mPackageManager.getInstalledApplications(int flags); 
List<Drawable> icons = new List<Drawable>; 
for (ApplicationInfo app : applications) { 
    icons.add(mPackageManager.getApplicationIcon(app)); 
} 

當然,這意味着你正在通過應用程序列表兩次,短缺。

+0

這會給標準分辨率的圖標,我已經擁有它。 – SWAppDev

相關問題