Ошибка WebView.capturePicture с параметрами URL - PullRequest
4 голосов
/ 16 сентября 2009

[Android Newbie alert]

Мне нужно захватить содержимое WebView в BitMap, и я столкнулся со странной проблемой. Мой подход состоит в том, чтобы зарегистрировать WebViewClient в WebView, и в onPageFinished я вызываю capturePicture . С простым URL-адресом (например, http://www.yahoo.com), он работает нормально. В других случаях capturePicture возвращает Picture со значениями высоты и ширины = 0. Страница загружается нормально в любом случае. Фактический URL, который я должен использовать, имеет довольно Несколько параметров URL, и я изначально думал, что проблема заключается в наличии каких-либо параметров, но это не так. Вот несколько примеров URL с комментариями, указывающими, работает ли он или нет:

  1. w.loadUrl ("http://www.yahoo.com"); // да
  2. w.loadUrl ("http://search.yahoo.com/search?p=android"); // обычно нет ???
  3. w.loadUrl ( "http://www.yahoo.com Foo = бар ?"); // Нет
  4. w.loadUrl ("http://www.google.com"); // yep
  5. w.loadUrl ( "http://www.google.com д = андроид ?"); // да
  6. w.loadUrl ( "http://www.google.com Foo = бар ?"); // да

Второй случай особенно расстраивает, поскольку, похоже, он не работает. Однако, если я сначала запускаю тестовое приложение с # 5, затем переключаю URL на # 2 и запускаю его.

Вот фрагмент реального упрощенного теста, который я создал:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    w = new WebView(this);
    w.setWebViewClient(new WebViewClient() {
        public void onPageFinished(WebView webview, String url) {
            Picture picture = webview.capturePicture();

            Log.d("Height", "" + picture.getHeight());
            Log.d("Width", "" + picture.getWidth());
            Bitmap b = Bitmap.createBitmap(picture.getWidth(), picture
                    .getHeight(), Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(b);
            picture.draw(c);
        }
    });

    w.getSettings().setJavaScriptEnabled(true);

    setContentView(w);

    //w.loadUrl("http://www.yahoo.com"); //yes
    w.loadUrl("http://search.yahoo.com/search?p=android"); // usually not???
    //w.loadUrl("http://www.yahoo.com?foo=bar"); // nope
    //w.loadUrl("http://www.google.com"); // yep
    //w.loadUrl("http://www.google.com?q=android"); // yep
    //w.loadUrl("http://www.google.com?foo=bar"); // yes
}

Кто-нибудь сталкивался с этой проблемой? Надеюсь, я просто идиот, и есть простое решение или обходной путь?

1 Ответ

8 голосов
/ 16 сентября 2009

Я только что снова посетил страницу документации. [Здесь] [1]

"Уведомить хост-приложение о завершении загрузки страницы. Этот метод вызывается только для основного фрейма. При вызове onPageFinished () картинка рендеринга может не быть обновлена. Получить уведомление для нового Picture используйте onNewPicture (WebView, Picture) . "

Использовал Picture Listener, я попробовал с вашим примером, и он работает.
Надеюсь, это поможет.

Я просто добавил приведенный ниже код в ваш пример и удалил WebViewClient

 w.setPictureListener(new PictureListener(){

    public void onNewPicture(WebView view, Picture picture) {
            Log.d(TAG, "onNewPicture- Height"+ picture.getHeight());
            Log.d(TAG, "onNewPicture- Width"+ picture.getWidth());
        }

    });

[1]: http://developer.android.com/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...