2

変更した 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 文字列をデコードすると、破損しているように見えます。より良い例として、このテキスト ファイルの内容をデコーダーにコピーします。

http://dl.dropbox.com/u/91982671/base64.txt

注: .php ファイルが data:image/png;base64 をデコードしようとすると、前にあるので、デコーダーに貼り付けやすくするために削除しました。

ここにあるデコーダ:

http://www.motobit.com/util/base64-decoder-encoder.asp

私が考えることができるのは、何らかの理由でJavaからbase64文字列を正しく出力していない可能性があるということだけです。何が起こっているのか誰にも分かりませんか?または何が原因でしょうか?

4

1 に答える 1

1

私は昨夜これで数時間遊んで、これらの提案のいくつかを考慮しました.

まず、エンコードする前に画像をチェックしました。大丈夫でした。

ただし、Javascript に移動する前にデコードすると、破損していることが示されました。これは、Java エンコーディング プロセスと関係があることを意味していました。これを解決するには、なぜそれが起こるのかを 100% 理解しているとは言いませんが、問題は次のコードにあるようです:

String mytextstring = "data:image/png;base64,"+base64String;

そして、「data:/image/png;base64」を Javascript と PHP デコーダーに送信する前に追加していた方法です。これを解決するために、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 によって以前に追加されたセクションを追加します。これで動作します。これが将来人々に役立つことを願っています。誰かが広告にコメントしたい場合は、気軽に知っていれば、その理由を説明してください。:)

于 2012-09-19T08:08:08.623 に答える