获取第三方用户安装的应用程序图标

时间:2018-04-04 23:37:02

标签: reactjs 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,指导我朝着正确的方向前进。

1 个答案:

答案 0 :(得分:0)

如果您还没有,请仔细阅读整个Android Native Modules页面。它不会那么长,并解决了您可能遇到的几个问题。

只能将这些类型发送到您的JS代码(通过@ReactMethod):

Boolean -> Bool
Integer -> Number
Double -> Number
Float -> Number
String -> String
Callback -> function
ReadableMap -> Object
ReadableArray -> Array

所以你有效地有两个选择:

  1. Drawable编码为其中一种类型,然后在JavaScript端解码,或
  2. 将文件写入磁盘,然后通过
  3. 发送路径

    我不确定图标的Drawable是什么类型,或者是否有保证。但是它们中的任何一个都应该以某种方式转换。例如,如果它是Bitmap,您可以进行Bitmap to Base64 String转化。