在做一个类似于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, 但我直接写错了。。。)
以下直接放部分代码:
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了。