2013-07-29 42 views
0

我想在我的文件管理器中添加一個選項以顯示目錄的應用程序圖標。下面的代碼不起作用;我做錯了什麼?Android應用程序圖標Filemanager

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

你希望得到安裝的應用程序的圖標? – user1140237

+0

不,我想要在我的SD卡 – df1e

+0

應用程序上未安裝卸載應用程序的appicons? .apk文件? – user1140237

回答

0

將此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; 
} 
+0

建議???? – df1e

0

PackageManager..getPackageArchiveInfo(..)方法只能用於安裝的APK,意味着它將在一個APK文件,該文件已經安裝只運行。目前,您可能會在apk文件中檢查該文件,該文件可能未安裝,從而導致軟件包信息失敗。

你可以做的是:

  1. 解壓apk文件編程(基本上apk文件是一個zip文件,你可以通過編程提取出來見http://www.jondev.net/articles/Unzipping_Files_with_Android_(Programmatically)

  2. 獲取AndroidManifest。從ZIP條目

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

  4. 從中獲取xml屬性'android:icon'
  5. 從zip條目中再次讀取圖標文件,作爲位圖。
  6. 無論你想要使用這個圖標位圖。
+0

@ df1e,是我的發佈有用嗎? – Suji

+0

我認爲這個方法可以工作,但涉及它。我會明天嘗試一下。謝謝! – df1e

0

與這 -

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

這不會起作用 – df1e

1

不斷嘗試這個..我取來自未安裝的APK文件SD卡目錄..icon圖標...

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

} 
+0

這是有幫助的,我會嘗試 – df1e

0
PackageManager pm = context.getPackageManager(); 
PackageInfo info =pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);