Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序图标文件管理器_Android_File_Icons_Drawable - Fatal编程技术网

Android应用程序图标文件管理器

Android应用程序图标文件管理器,android,file,icons,drawable,Android,File,Icons,Drawable,我想在我的文件管理器中添加一个选项,以显示目录的应用程序图标。下面的代码不起作用;我做错了什么 ImageView icon; private static Activity activity; String temp = mFileMang.getCurrentDir(); } else if (sub_ext.equalsIgnoreCase("apk")) { final Drawable appicon; try {

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

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

PackageManager..getPackageArchiveInfo(..)
方法将仅适用于已安装的apk,这意味着它将仅在已安装的apk文件上运行。目前,您可能在apk文件上检查此项,该文件可能未安装,因此获取包信息失败

您可以做的是:

  • 以编程方式解压缩apk文件(基本上apk文件是一个zip文件,您可以通过编程方式解压缩它。请参阅)

  • 从zip条目获取AndroidManifest.xml文件

  • 解析AndroidManifest.xml文件(请参阅)

  • 从中获取xml属性“android:icon”
  • 从zip条目中再次读取图标文件作为位图
  • 无论您想在哪里使用此图标位图
  • 试试这个-

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

    试试这个。。我从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;
        }
    
    }
    
    公共A类扩展活动{
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.app_列表);
    ListView列表=(ListView)findViewById(R.id.app_列表);
    ArrayList listData=getApks();
    setAdapter(newtestadapter(listData,A.this));
    }
    类PackageInfo结构{
    字符串appname=“”;
    字符串pname=“”;
    字符串versionName=“”;
    int versionCode=0;
    可绘制图标;
    字符串datadir=“”;
    }
    公共阵列列表;
    私有数组列表getApks(){
    试一试{
    String path=Environment.getExternalStorageDirectory()+“/test”;
    文件=新文件(路径);
    String[]list=file.list();
    res=新的ArrayList();
    for(字符串str:list){
    字符串未安装\u apk\u file=path+“/”+str;
    PackageManager pm=getPackageManager();
    PackageInfo pi=pm.getPackageArchiveInfo(
    未安装apk文件,0);
    if(pi==null)
    继续;
    //秘密在于这两条线。。。。
    pi.applicationInfo.sourceDir=未安装apk文件;
    pi.applicationInfo.publicSourceDir=未安装apk文件;
    //
    可绘图APKicon=pi.applicationInfo.loadIcon(pm);
    字符串AppName=(字符串)pi.applicationInfo.loadLabel(pm);
    PackageInfoStruct pack=新的PackageInfoStruct();
    pack.icon=APKicon;
    pack.pname=AppName;
    res.add(包装);
    }
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回res;
    }
    私有ArrayList getInstalledApps(){
    试一试{
    res=新的ArrayList();
    List packs=getPackageManager().getInstalledPackages(
    0);
    对于(int i=0;i
    添加此
    http://stackoverflow.com/questions/17919151/android-app-icon-filemanager/17924795#17924795
    对于我的代码,我需要剪切它。最后我得到了这个:

    但当我打开目录时,它只加载一个图标,并为所有其他应用程序显示它。


    是否要获取已安装应用程序的图标?否我想获取未安装的sdcardapplication上已卸载应用程序的应用图标。apk文件?是的,从.apk文件中我试图从sd卡中的apk文件中获取图标&未安装…&我喜欢这些图标。我发了一封邮件请检查一下。。。HTH@df1e,我的帖子有用吗?我想这个方法会管用,但它涉及到很多问题。我明天就去试试。谢谢这很有帮助,我会努力的
    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;
    }
    
    PackageManager pm = context.getPackageManager();
    PackageInfo info =pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);