Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подмена ресурсов в (WebViewClient) WebView 
:(
    Опции темы
beaver
Дата 19.12.2016, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.7.2007

Репутация: нет
Всего: нет



В android приложении в webview открывается страница сайта. На странице есть картинки, стили, js-файлы, загружаемые как с того-же host, так и с других . Нужно подменить все сторонние ресурсы  на локальные, из android_assets или вовсе не грузить.
PM MAIL   Вверх
Felan
Дата 19.12.2016, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: нет
Всего: 7



Возможно поможет перехват реквестов. По идее все эти ресурсы должны грузиться отдельно.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
beaver
Дата 19.12.2016, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.7.2007

Репутация: нет
Всего: нет



Цитата(Felan @ 19.12.2016,  18:41)
Возможно поможет перехват реквестов. По идее все эти ресурсы должны грузиться отдельно.

Вот так, в принципе, должно работать...
Код

private class myWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().contains(URL_HOST)) {
                if(url.equals(URL_FULL)){
                    Log.i("MyAPP", "Load pagehtml URL_FULL ");
                    view.loadUrl(url);
                } else {
                    Log.i("MyAPP", "Load pagehtml URL_HOST ");
                    view.loadUrl(url);
                }
                return false;
            } else {
                Log.i("MyAPP", "Load pagehtml NOT_HOST ");
            }
            return true;
        }

        public void onPageStarted(WebView view,String url, Bitmap favicon){
            Log.i("MyAPP", "STARTED load page ");
        }

        @Override
        public void onLoadResource(WebView view, String url) {

            if (Uri.parse(url).getHost().contains(URL_HOST)) {
                if (url.equals(URL_FULL)) {
                   Log.i("MyAPP", "Load page HTML ");
                    
                   super.onLoadResource(view, url);
                } else {
                    Log.i("MyAPP", "Load resource URL_HOST ");
                    super.onLoadResource(view, url);
                }
            } else {
                if (Uri.parse(url).getHost().contains("www.facebook.com")) {
                    Log.i("MyAPP", "Load FaceBook ");
                    super.onLoadResource(view, "file:///android_asset/empty.html");
                } else {
                    Log.i("MyAPP", "Load resource OTHER ");
                    super.onLoadResource(view, "file:///android_asset/empty.js");
                }
            }
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:" + "var e = 1;");
        }

    }
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browser);

        mWebView = (WebView) findViewById(R.id.web_view);
        mWebView.setWebViewClient(new myWebViewClient());
/*        mWebView.setWebChromeClient(new myWebChromeClient());*/
        mWebView.getSettings().setJavaScriptEnabled(true);
        Log.i("MyAPP", "Load start in onCreate");
        mWebView.loadUrl(URL_FULL);

    }

Логи
Код

I/MyAPP: Load start in onCreate
D/OpenGLRenderer: Enabling debug mode 0
W/AwContents: nativeOnDraw failed; clearing to background color.
I/MyAPP: STARTED load page 
I/MyAPP: Load page HTML 
W/AwContents: nativeOnDraw failed; clearing to background color.
I/MyAPP: Load FaceBook 
I/MyAPP: Load resource OTHER 
I/MyAPP: Load resource OTHER 
I/MyAPP: Load resource OTHER 
I/MyAPP: Load resource URL_HOST 
I/MyAPP: Load resource URL_HOST 
I/chromium: [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported
I/chromium: [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported
I/chromium: [INFO:CONSOLE(2)] "Uncaught TypeError: Cannot read property 'length' of null", source: http://... (2)
I/MyAPP: Load resource URL_HOST 
I/MyAPP: Load resource OTHER 
I/MyAPP: Load resource OTHER 
I/MyAPP: Load resource URL_HOST 

Вроде бы как всё отрабатывает, но всё равно загружаются сторонние скрипты и фреймы...
в onPageFinished вставлял WebView.saveWebArchive(), смотрел результат... увы, подмена не удалась...

onLoadResource вообще непонятно работает.
PM MAIL   Вверх
beaver
Дата 19.12.2016, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.7.2007

Репутация: нет
Всего: нет



Цитата(Felan @ 19.12.2016,  18:41)
Возможно поможет перехват реквестов. По идее все эти ресурсы должны грузиться отдельно.

Большое спасибо за подталкивание в нужном направлении
Код

private class myWebViewClient extends WebViewClient {
public WebResourceResponse shouldInterceptRequest(WebView view, String url){
            if (Uri.parse(url).getHost().contains(URL_HOST)) {
                if (url.equals(URL_FULL)) {
                    Log.i("MyAPP", "Load shouldInterceptRequest page HTML " + url);
                    return super.shouldInterceptRequest(view, url);
                } else {
                    Log.i("MyAPP", "Load shouldInterceptRequest resource URL_HOST " + url);
                    return super.shouldInterceptRequest(view, url);
                }
            } else {
                Log.i("MyAPP", "Load shouldInterceptRequest resource OTHER " + url);
                return new WebResourceResponse("text/plain", "UTF-8", null);
            }
        }
}

И всё заработало....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.