记录Android学习中问题:asset的文件夹不能访问?使用app默认的文件夹。

本文介绍了一种在Android应用中将APK图标存储为图片文件的方法,并详细解释了如何使用PackageManager和PackageInfo获取APK信息,将Drawable对象转换为Bitmap并保存至应用默认文件夹的过程。

在做一个类似于launcher的apk,不过界面部分使用js,html+css做的。开始设计时,上面的apk图片和报名都是写死的,实用肯定需要添加功能。

添加就需要获取apk的图片,包名,应用程序名。 得知可以用 PackageManager 和 PackageInfo 来获得(然后用json通过字符传给js部分),

但获取的apk图片是一个 Drawable 对象, 还需转成 BitMap 对象,再将其存成png图像文件。(可是存哪就是个问题了)

经过尝试和查询,网上很多人说assets文件只读不能写(之所以首先想到assets因为html和js文件就放那了,习惯性认为保存的图片也应该在那),

只能尝试使用app默认的文件夹(但不知道js能否访问到?后来证实是可以的)。

关于app默认的文件夹这个写的不错: (也就是 data/data/packageName/files, 但我直接写错了。。。)

Android中读写文件_可可无敌豆的博客-CSDN博客

以下直接放部分代码:

1. 关于文件存储,把 Drawable 对象 最终存在app的默认文件夹中。

存储方法:

/**
	 * save as a picture format
	 * */
	public static boolean saveBitmap2file(Context context ,Bitmap bmp, String filename) {
		CompressFormat format = Bitmap.CompressFormat.PNG;
		int quality = 100; // PNG which is lossless, will ignore the quality setting
		OutputStream stream = null;
		try {
			// 不知道为什么没用。
			//stream = new FileOutputStream(Utils.Path +"com.konka.gamelist/files/" + filename);
			stream = context.openFileOutput(filename,Context.MODE_PRIVATE);
			
		} catch (FileNotFoundException e) { // TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(Utils.LTAG, "can't find the file: " + filename);
			Log.e(Utils.LTAG, "ERROR: " + e.getMessage());

		}

		
		return bmp.compress(format, quality, stream);
	}

2. 调用的地方:

	public static void testMethod(Context context) {
		
	
		PackageManager pManager = context.getPackageManager();
		List<PackageInfo> appList = Utils.getAllApps(context);

//		for (PackageInfo pinfo : appList) {
////			PackageInfo pinfo = appList.get(i);
///*			ShareItemInfo shareItem = new ShareItemInfo();
//			// set Icon
//			shareItem.setIcon(pManager
//					.getApplicationIcon(pinfo.applicationInfo));
//			// set Application Name
//			shareItem.setLabel(pManager.getApplicationLabel(
//					pinfo.applicationInfo).toString());
//			// set Package Name
//			shareItem.setPackageName(pinfo.applicationInfo.packageName);*/
//		}
		
		PackageInfo pinfo = appList.get(0);
		Drawable drawObj = pManager.getApplicationIcon(pinfo.applicationInfo);
		String appName = pManager.getApplicationLabel(pinfo.applicationInfo).toString();
		String pkgName = pinfo.applicationInfo.packageName;
		// debug 
		Log.d(LTAG, "appName: " + appName +"/ pkgName: " + pkgName);
		BitmapDrawable bd = (BitmapDrawable) drawObj;
		
		boolean result = Utils.saveBitmap2file(context,  bd.getBitmap(), "test.png");
		Log.d(LTAG, "SaveResult: " + result);
	}


3.最后在js中输入路径测试一下,能否访问得到(O(∩_∩)O 还好可以啊。)

var smallIcons = [
{picSrc : "images/new/angryBird.png", chName : "愤怒小鸟", 	appName : "fusion"},
{picSrc : "images/new/cutFruit.png",  chName : "切水果", 	appName : "fruit"},
{picSrc : "images/new/pvz.jpg", 		 chName : "植物战僵尸", appName : "pvz"},
{picSrc : "images/new/sgs.png", 		chName : "三国杀", 	appName : "sgs"},
{picSrc : "file:///data/data/com.XXXXX.gamelist/files/test.png", chName : "芝麻开门", 	appName : "haha"},
];


4.这样后面改改,后面apk的信息就通过json字符串传给js吧,图像层面上显示apk就靠这个list了。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值