Base64字符串已从Java损坏

Base64字符串已从Java损坏,java,cordova,base64,decode,Java,Cordova,Base64,Decode,我修改了一个phonegap插件。Java部件输出base64字符串: package org.apache.cordova; import java.io.ByteArrayOutputStream; import java.io.File; import org.apache.cordova.api.Plugin; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; import android.

我修改了一个phonegap插件。Java部件输出base64字符串:

package org.apache.cordova;

import java.io.ByteArrayOutputStream;
import java.io.File;

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), id);
            }
        });

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

}
然后我将其传递给一些Javascript,然后将字符串发送到服务器。我已经检查了.php文件接收的字符串,base64字符串是相同的。但是,当我解码base64字符串时,它似乎已损坏。为了获得更好的示例,请将此文本文件的内容复制到解码器中

注意:当.php文件试图对其进行解码时,数据为:image/png;base64,是infront,为了便于您将其粘贴到解码器中,我刚刚删除了它

解码器可在此处找到:


我所能想到的是,由于某种原因,我可能无法从Java中正确输出base64字符串。有人知道发生了什么事吗?或者是什么原因造成的

昨晚我花了好几个小时考虑了这些建议

首先,我检查了图像,然后对其进行编码。很好

然而,在它进入Javascript之前对其进行解码表明它已损坏,这意味着它必须与Java编码过程有关。为了解决这个问题,我并不声称100%理解为什么会发生这种情况,但问题似乎在于以下代码:

String mytextstring = "data:image/png;base64,"+base64String;
在将其发送到Javascript和PHP解码器之前,我添加“data:/image/png;base64”的方式。为了解决这个问题,我将其从Java代码中删除,使其成为:

String mytextstring = base64String;
在发送到服务器的JavaScript函数中,我将其添加到了字符串中,这起作用,我收到了一个未损坏的图像。以防有人怀疑/关心我添加的Javascript函数,如下所示:

function returnScreenshotImage(imageData) { 
    base64string = "data:image/png;base64,"+imageData;
    console.log("String: "+base64string);

    var url = 'http://www.websitename.co.uk/upload.php';
    var params = {image: imageData};

    document.basicfrm.oldscreenshotimg.value = document.basicfrm.screenshotimg.value;

    // send the data
    $.post(url, params, function(data) {
           document.basicfrm.screenshotimg.value = data;

           });    
}
正如你所看到的:

base64string = "data:image/png;base64,"+imageData;

添加先前由Java添加的部分。现在可以了。希望这对未来的人们有所帮助。如果有人愿意评论广告,请解释原因,如果他们知道,请随意。:)

在将其发送到javascript之前,您是否尝试过解码并保存它?也许你应该试着用Sun Java解码它?查看此链接:您是否尝试过在编码png图像之前保存它,以查看它是否在压缩步骤期间或之前损坏?您是否尝试过commons codec Base64编码器以查看是否有相同的结果?虽然有这样的外部需求很糟糕,但这确实意味着你也可以支持Android 2.1设备。这就是Cordova目前用于Base64编码的内容。