【问题标题】:Android App Icon FilemanagerAndroid 应用程序图标文件管理器
【发布时间】:2013-07-29 08:20:31
【问题描述】:

我想在我的文件管理器中添加一个选项来显示目录的应用程序图标。下面的代码不起作用;我做错了什么?

ImageView icon;
private static Activity activity;
String temp = mFileMang.getCurrentDir();

} else if (sub_ext.equalsIgnoreCase("apk")) {
                final Drawable appicon;
                try {
                    PackageInfo packageInfo = activity.getPackageManager()
                            .getPackageArchiveInfo(temp,
                                    PackageManager.GET_ACTIVITIES);
                    ApplicationInfo appInfo = packageInfo.applicationInfo;

                    appInfo.sourceDir = temp;
                    appInfo.publicSourceDir = temp;

                    appicon = appInfo
                            .loadIcon(activity.getPackageManager());
                    mViewHolder.icon.setImageDrawable(appicon);

                } catch (Exception e) {
                    mViewHolder.icon.setImageResource(R.drawable.appicon);
                }

【问题讨论】:

  • 你想获取已安装应用的图标吗?
  • 不,我想在我的 sdcard 上获取已卸载应用程序的 appicons
  • 应用程序没有安装? .apk 文件?
  • 是的,来自 .apk 文件
  • 我试图从我的 sd 卡中的 apk 文件中获取图标,但未安装... & 我 gt 图标。我发布了ans请检查一次stackoverflow.com/a/17924795/1140237 ...HTH

标签: android file icons drawable


【解决方案1】:

试试这个..我从 sd 卡目录中获取图标..从未安装的 apk 文件中获取图标...

    public class A extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_listing);
        ListView list = (ListView) findViewById(R.id.app_listing);
        ArrayList<PackageInfoStruct> listData = getApks();
        list.setAdapter(new TestAdapter(listData, A.this));

    }

    class PackageInfoStruct {
        String appname = "";
        String pname = "";
        String versionName = "";
        int versionCode = 0;
        Drawable icon;
        String datadir = "";
    }

    public ArrayList<PackageInfoStruct> res;

    private ArrayList<PackageInfoStruct> getApks() {
        try {
            String path = Environment.getExternalStorageDirectory() + "/test";
            File file = new File(path);
            String[] list = file.list();
            res = new ArrayList<PackageInfoStruct>();
            for (String str : list) {
                String not_installed_apk_file = path + "/" + str;
                PackageManager pm = getPackageManager();
                PackageInfo pi = pm.getPackageArchiveInfo(
                        not_installed_apk_file, 0);
                if (pi == null)
                    continue;
                // the secret are these two lines....
                pi.applicationInfo.sourceDir = not_installed_apk_file;
                pi.applicationInfo.publicSourceDir = not_installed_apk_file;
                //
                Drawable APKicon = pi.applicationInfo.loadIcon(pm);
                String AppName = (String) pi.applicationInfo.loadLabel(pm);
                PackageInfoStruct pack = new PackageInfoStruct();
                pack.icon = APKicon;
                pack.pname = AppName;
                res.add(pack);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    private ArrayList<PackageInfoStruct> getInstalledApps() {
        try {
            res = new ArrayList<PackageInfoStruct>();
            List<PackageInfo> packs = getPackageManager().getInstalledPackages(
                    0);

            for (int i = 0; i < packs.size(); i++) {
                PackageInfo p = packs.get(i);

                PackageInfoStruct newInfo = new PackageInfoStruct();
                newInfo.appname = p.applicationInfo.loadLabel(
                        getPackageManager()).toString();
                newInfo.pname = p.packageName;
                newInfo.datadir = p.applicationInfo.dataDir;
                newInfo.versionName = p.versionName;
                newInfo.versionCode = p.versionCode;
                newInfo.icon = p.applicationInfo.loadIcon(this
                        .getPackageManager());
                res.add(newInfo);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

}

【讨论】:

  • 这个很有帮助,我会试试
【解决方案2】:

PackageManager..getPackageArchiveInfo(..) 方法仅适用于已安装的 apk,意味着它仅适用于已安装的 apk 文件。目前您可能会在一个可能未安装的 apk 文件上检查此内容,因此获取包信息失败。

你可以做的是:

  1. 程序解压apk文件(apk文件基本上是一个zip文件,你可以程序解压。见http://www.jondev.net/articles/Unzipping_Files_with_Android_(Programmatically)

  2. 从 zip 条目中获取 AndroidManifest.xml 文件

  3. 解析AndroidManifest.xml文件(见How to parse the AndroidManifest.xml file inside an .apk package

  4. 从中获取xml属性'android:icon'
  5. 再次从 zip 条目中读取图标文件作为位图。
  6. 在任何地方使用此图标位图。

【讨论】:

  • @df1e,我的帖子有用吗?
  • 我认为这种方法会起作用,但它涉及到。我明天试试。谢谢!
【解决方案3】:

试试这个-

ImageView icon;
private static Activity activity;
String temp = mFileMang.getCurrentDir();

} else if (sub_ext.equalsIgnoreCase("apk")) {
            final Drawable appicon;
            try {
                PackageInfo packageInfo = activity.getPackageManager()
                        .getPackageArchiveInfo(temp,
                                PackageManager.GET_ACTIVITIES);
                ApplicationInfo appInfo = packageInfo.applicationInfo;

                appInfo.sourceDir = temp;
                appInfo.publicSourceDir = temp;

                  PackageManager pm = getPackageManager();
          appicon = pm.getApplicationIcon(appInfo.packageName);

                mViewHolder.icon.setImageDrawable(appicon);

            } catch (Exception e) {
                mViewHolder.icon.setImageResource(R.drawable.appicon);
            }

【讨论】:

    【解决方案4】:

    要将此http://stackoverflow.com/questions/17919151/android-app-icon-filemanager/17924795#17924795 添加到我的代码中,我需要将其删除。终于明白了:

    但是当我打开目录时,它只加载 1 个图标并为所有其他应用程序显示它。 https://www.dropbox.com/s/e2bonh3fkfseggf/Screenshot_2013-07-31-13-58-18.png

    File file = new File(temp + "/" + mDataSource.get(position));
    
    } else if (sub_ext.equalsIgnoreCase("apk")) {
    
        try {
            Drawable icon = getApk(file);
            mViewHolder.icon.setImageDrawable(icon);
    
        } catch (Exception e) {
            mViewHolder.icon.setImageResource(R.drawable.appicon);
        }
    
    
    private Drawable getApk(File file2) {
        try {
            String path = mFileMang.getCurrentDir();
            File file = new File(path);
            String[] list = file.list();
    
            for (String str : list) {
                String not_installed_apk_file = path + "/" + str;
                PackageManager pm = mContext.getPackageManager();
                PackageInfo pi = pm.getPackageArchiveInfo(
                        not_installed_apk_file, 0);
                if (pi == null)
                    continue;
                // the secret are these two lines....
                pi.applicationInfo.sourceDir = not_installed_apk_file;
                pi.applicationInfo.publicSourceDir = not_installed_apk_file;
                //
                res = pi.applicationInfo.loadIcon(pm);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }
    

    【讨论】:

      【解决方案5】:
      PackageManager pm = context.getPackageManager();
      PackageInfo info =pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);
      

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多