WebView обращается к растровому изображению Android из Java в Qt C++

Я пытаюсь сгенерировать веб-представление на Java (Android) и вернуть растровое изображение Android обратно в Qt C++. Пока я получаю недопустимый объект.

Статическая функция Java: (в android/src/com/parity/jni/JniExtras.java)

package com.parity.jni;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.webkit.WebView;

public class JniExtras {
    public static Bitmap htmlToBitmap(String html, float scale, int w, int h, int r, int g, int b, int a) {
        int color = (r << 24) | (g << 16) | (b << 8) | a;

        WebView web = new WebView(null);
        web.loadData(html, "text/html", "UTF-8");
        web.layout(0, 0, (int)((float)w / scale), (int)((float)h / scale));

        Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);

        Paint paint = new Paint();
        paint.setColor(color);

        canvas.drawPaint(paint);
        canvas.scale(scale, scale);

        web.draw(canvas);

        return bitmap;
    }
}

И я пытаюсь получить растровое изображение в QT с помощью:

QAndroidJniObject jni_html = QAndroidJniObject::fromString(html);
QAndroidJniObject bitmap = QAndroidJniObject::callStaticObjectMethod(
            "com/parity/jni/JniExtras",
            "htmlToBitmap",
            "(Ljava/lang/String;FIIIIII)Ljava/lang/Object;",
            jni_html.object<jstring>(),
            scale,
            w, h,
            r, g, b, a);

if (!bitmap.isValid()) {
    qDebug("Java call failed to get android bitmap");
}

Кто-нибудь может сказать мне, что я делаю не так?

Изменить 1:

Тем временем я пытаюсь заставить WebView рисовать на растровое изображение в проекте Android Studio. Вот что у меня так далеко:

package com.parity.webviewtest;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    String tag = "WLGfx";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int wid = 1000;
        int hgt = 1000;

        String html = "<div align=\"center\"><font face=\"FreeMono\"><b><font color=\"#FF0000\"><font size=\"6\">Title of report</font></font></b></font><br></div><font face=\"FreeSerif\" color=\"#0000FF\">Now as we enter a new era of stuff to do some really amazing and weird things, we notice that our distractions are seemingly taking our focus away from the smaller and more important things that we should be thoroughly immersed in. Either way, this will test out a formatted paragraph.</font><font face=\"FreeSerif\"><br></font><ol><li><font face=\"FreeSerif\" color=\"#008000\">Throw away old bins</font></li><li><font face=\"FreeSerif\" color=\"#008000\">Buy new bins</font></li><li><font face=\"FreeSerif\" color=\"#008000\">Fill the new bins</font></li></ol><div align=\"center\"><font face=\"FreeSerif\" color=\"#993300\"><i>The quick brown fox does stuff</i></font><br></div>";
        //String html = "Some line of text to test out...";

        Log.d(tag, html);

        Context context = this.getApplicationContext();

        WebView web = new WebView(context);
        web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        web.layout(0,0,wid,hgt);
        web.loadData(html, "text/html", "UTF-8");
        web.buildDrawingCache();

        Paint paint = new Paint();
        paint.setColor(0xffffffff);

        Bitmap bitmap = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        web.draw(canvas);

        ImageView img = (ImageView)findViewById(R.id.imageView);
        img.setImageBitmap(bitmap);
    }

}

Тем не менее я получаю пустое растровое изображение.

Изменить 2:

Как указано в комментариях, я пробовал метод capturePicture() и getDrawingCache(), и ни один из них не работает в тестовом проекте Android Studio:

Context context = getApplicationContext();

WebView web = new WebView(context);
web.setEnabled(true);
//web.loadUrl(html);
web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
web.layout(0,0,wid,hgt);
web.loadData(html, "text/html", "UTF-8");

web.setDrawingCacheEnabled(true);
web.buildDrawingCache();

Picture picture = web.capturePicture();
Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//picture.draw(canvas);
canvas.drawPicture(picture);

Log.d(tag, "Picture: " + picture.getWidth() + "x" + picture.getHeight());

//Bitmap bitmap = Bitmap.createBitmap(web.getDrawingCache());
//web.setDrawingCacheEnabled(false);

//Paint paint = new Paint();
//paint.setColor(0xffffffff);

//Bitmap bitmap = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_8888);
//Canvas canvas = new Canvas(bitmap);
//web.draw(canvas);

ImageView img = (ImageView)findViewById(R.id.imageView);
img.setImageBitmap(bitmap);

Основная причина, по которой я хочу рендерить html в растровое изображение, заключается в том, что мне нужно только передавать простые html-строки по сети на устройства, а сервер не рендерит изображения и не отправляет их.

0 ответов

Другие вопросы по тегам