【发布时间】:2018-09-14 15:55:36
【问题描述】:
我是 react-native 的新手,请帮助我。我打算做的是获取与用户在其设备上安装的应用程序相关联的应用程序图标。 我确实查看了this code 并意识到我无法将其传递回我的 JS。
这是我目前正在做的事情。
private List<String> getNonSystemApps() {
List<PackageInfo> packages = this.reactContext
.getPackageManager()
.getInstalledPackages(0);
List<String> ret = new ArrayList<>();
for (final PackageInfo p: packages) {
if ((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("name", p.packageName);
jsonObject.put("firstInstallTime", p.firstInstallTime);
jsonObject.put("installLocation", p.installLocation);
jsonObject.put("applicationInfo", p.applicationInfo);
jsonObject.put("permissions", getPermissionsByPackageName(p.packageName));
Drawable icon = reactContext.getPackageManager().getApplicationIcon(p.packageName);
ret.add(jsonObject.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return ret;
}
你能帮我解决这个问题吗?
谢谢
编辑 我设法让它工作,根据 Aaron 的建议,我创建了另一个私有函数来处理图像。此函数将生成应用程序图标的 base 64 版本。
private String getBitmapOfAnAppAsBase64(String packageName) {
if(packageName.isEmpty() ) return new String("");
String base64Encoded = "";
Bitmap bitmap;
try {
Drawable appIcon = this.reactContext.getPackageManager().getApplicationIcon(packageName);
if(appIcon instanceof BitmapDrawable) {
bitmap= ((BitmapDrawable)appIcon).getBitmap();
} else {
bitmap = Bitmap.createBitmap(appIcon.getIntrinsicWidth(), appIcon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
base64Encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
} catch(Exception e) {
Log.d(TAG,"An error was encounted while getting the package information. The error follows : " + e.toString());
}
return base64Encoded;
}
然后我在我的原始函数中使用这个生成的字符串,并进行以下修改。
旧的无效代码
Drawable icon = reactContext.getPackageManager().getApplicationIcon(p.packageName);
新的工作代码
jsonObject.put("icon", getBitmapOfAnAppAsBase64(p.packageName));
然后在 React-Native 中 - 它是小菜一碟,因为它已经支持 base64。
"icon" : 'data:image/png;base64,'+installAppObj.icon
非常感谢 Aaron 为我指引正确的方向。
【问题讨论】:
标签: reactjs react-native