2

各アプリの高解像度アイコンが必要なアプリをやっています。

私は今朝からいくつかの調査を行いましたが、私が見つけた答えはどれもうまくいきませんでした.

ここにそれらのうちの2つがありますが、私にとって何が悪いのですか。

参考までに、パッケージマネージャーからすべての「packageinfo」を取得しました。必要なものはすべて見つかりましたが、高解像度のアイコンは...

1. getDrawableForDensity を使用:

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;
}
}

これに関する私の問題は、componentName に何を入力すればよいかわからないことです。packagemanager から取得した情報を使用して「構築」するにはどうすればよいですか?

2.その他の解決 方法 packageManager から xhdpi アプリのアイコンを取得していますか?

// 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);

「アイコン」に関するエラー:

アイコンを解決できないか、フィールドではありません

4

2 に答える 2

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」クラスから継承されたパブリック フィールド「icon」があります。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));
}

もちろん、これはアプリケーションのリストを 2 回確認することを意味します。

于 2013-12-18T21:02:44.430 に答える
1

これを試してみてください。あなたが持っているコードに似ていますが、私にとってはうまくいくようです:

// HiRes アイコンを取得

             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);
           }
    }
于 2014-05-13T01:54:39.237 に答える