【问题标题】:Get a third party user installed app icon获取第三方用户安装的应用图标
【发布时间】: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


    【解决方案1】:

    如果您还没有阅读,请通读整个 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. 将文件写入磁盘,并将路径发送过来

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

    【讨论】:

    • 感谢您的指点。非常感谢。将其标记为正确答案,因为它不会让我误入歧途:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多