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 ファイルには、成功/失敗のコールバックで呼び出す方法がありません。したがって、base64 データで呼び出される成功コールバックを取得するには、.js コードを変更する必要があります。次のようなものを 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, ..., ...)

または、コンストラクターがない場合は、次のようにセッターを使用してみてください (たとえば):

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

API が公開されていないと、PluginResult 型のオブジェクトを適切に使用する方法を理解するのが難しくなります (自分で使用したことはありません)。

ニーズに合ったものが何もないことがわかったが、絶対に PluginResult オブジェクトを使用する必要がある場合は、PluginResult とエンコードされた文字列の両方を含むクラスを作成し、それをメソッドの戻り値の型として使用することを検討してください。このような:

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)。そのコンストラクターの2番目のパラメーターに

渡すことができると思います。base64Stringメッセージは JSON 文字列形式に変換されますが、その形式は java/javascript で簡単に処理できます。

お役に立てれば。
よろしく

于 2012-09-18T12:38:46.233 に答える