0

非常基本上我有一个图像已转换为 Base64 字符串。以下代码是如何将其转换为 base64string 以及我如何尝试返回它。这是对 phonegap 插件的修改,所以请原谅某些东西的命名。

package org.apache.cordova;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Base64;
import android.view.View;



public class Screenshot extends Plugin {

    @Override

    public PluginResult execute(String action, JSONArray args, String callbackId) {
        // starting on ICS, some WebView methods
        // can only be called on UI threads
        final Plugin that = this;
        final String id = callbackId;
        super.cordova.getActivity().runOnUiThread(new Runnable() {
            //@Override
            @TargetApi(8)
            public void run() {
                View view = webView.getRootView();

                view.setDrawingCacheEnabled(true);
                Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
                view.setDrawingCacheEnabled(false);

                File folder = new File(Environment.getExternalStorageDirectory(), "Pictures");
                if (!folder.exists()) {
                    folder.mkdirs();

                }

                File f = new File(folder, "screenshot_" + System.currentTimeMillis() + ".png");
                System.out.println(folder);
                System.out.println("screenshot_" + System.currentTimeMillis() + ".png");



                ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                byte[] b = baos.toByteArray();
                String base64String = Base64.encodeToString(b, Base64.DEFAULT);
                String mytextstring = "data:image/png;base64,"+base64String;
                System.out.println(mytextstring);

                that.success(new PluginResult(PluginResult.Status.OK), mytextstring);
            }
        });

        PluginResult imageData = new PluginResult(PluginResult.Status.NO_RESULT);
        imageData.setKeepCallback(true);
        System.out.println("imageData:==================================================================================>>>>>"+imageData);
        return imageData;
    }

}

这一行:

System.out.println(mytextstring);

输出 base64 字符串,但是这一行:

System.out.println("imageData:==================================================================================>>>>>"+imageData);

没有。我正在尝试让 imageData 包含 base64string,以便我可以返回它并在某些 Javascript 中使用它。我已经玩了一段时间的代码,但没有成功,我是 Java 新手,所以真的不知道我有多接近。有人可以指导我吗?

编辑我只想返回 Base64String,仅此而已。

4

3 回答 3

1

您调用 this.success 的代码不正确。它应该是:

that.success(new PluginResult(PluginResult.Status.OK, mytextstring), id);

你拥有它的方式:

that.success(new PluginResult(PluginResult.Status.OK), mytextstring);

告诉回调服务器在“mytextstring”处调用成功回调。显然,“mytextstring”中没有存储回调,因为这是您的结果。

此外,屏幕截图插件的默认 .js 文件没有为您提供通过成功/失败回调调用它的方法。因此,您需要修改 .js 代码才能使用 base64 数据调用成功回调。在 Screenshot.js 中添加类似这样的内容:

Screenshot.prototype.getBase64Screenshot = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "Screenshot", "saveScreenshot", []);
};

然后你可以通过这样做来调用它:

window.plugins.screenshot.getBase64Screenshot(function(data) {
    console.log("Data = " + data);
}, function() {
    console.log("We got an error");
});

显然,您会提供自己的成功和失败回调。

于 2012-09-18T13:30:58.943 回答
0

我认为这是您的代码中的错误。我将尝试从纯 java 的角度提供几种方法

当您创建“PluginResult”对象时,您不会以任何方式将其连接到您创建的字符串(base64string 变量)。

如果您想返回 base64 编码的字符串,您应该执行以下操作:

PluginResult imageData = new PluginResult(..., ...,  base64string, ..., ...)

或者,如果您没有构造函数,请尝试使用这样的 setter(例如):

PlugingResult imageData  = new PlugingResult(...)
imageData.setEncodedString(imageData)

如果没有公开的 API,很难理解如何正确使用 PluginResult 类型的对象(我自己从未使用过它)

如果您发现没有任何东西适合您的需求,但您绝对必须使用 PluginResult 对象,那么您可以考虑创建一个包含 PluginResult 和编码的 String 的类,并将其用作方法的返回类型。像这样:

class MyPluginResult {
   private PluginResult pluginResult;
   private String encodedString;
   /*
    ....

     getters/setters/constructors go here
    */
}

比让你的方法返回 MyPluginResult,更改创建 PluginResult 并返回它的代码,你会没事的。

希望这可以帮助

于 2012-09-18T12:34:08.157 回答
0

我对 Cordova 和 PhoneGap 了解不多,但是通过 API 可以看到构造函数 public PluginResult(Status status, String message)

我想您可以将 传递base64String给该构造函数的第二个参数。消息被转换为 JSON 字符串格式,但您可以轻松地在 java / javascript 中处理该格式。

希望这可以帮助。
问候

于 2012-09-18T12:38:46.233 回答