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文件上检查此项,该文件可能未安装,因此获取包信息失败
您可以做的是:
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);