|
Android Разработка игр на платформе Android |
15.12.2011, 00:14
|
#1
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Как контролировать WebView?
вопрос: Как прочитать текст страницы загруженной в WebView?
на Activity нет никаких элементов управления, кроме WebView. я свободно прыгаю по сайту/сайтам, которые открываются не в стандартном браузере, а в том же WebView (при этом работают скрипты со страниц, например проводится многостраничная регистрация на сайте). мне бы хотелось знать, что отображается на страницах, чтобы отловить какое-то кодовое слово, признак, по которому я решу, что сеанс завершен и закрою Activity, сохранив, полученные данные в глобальных переменных.
как я могу реализовать контроль, в каком методе разместить, какие функции использовать чтобы узнать содержимое загруженной страницы?
сам победить пока не смог, инглишсцуковерибед. есть подозрение, что нужно использовать методы WebViewClient.
package ru.jru.sru; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; import android.webkit.WebViewClient; public class RegActivity extends Activity { private class wvClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } public WebView wvReg; @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.regform); wvReg = (WebView)findViewById(R.id.wvReg); wvReg.setWebViewClient(new wvClient()); wvReg.getSettings().setJavaScriptEnabled(true); wvReg.loadUrl("http://www.mysite.ru/registration.php?request=newuser"); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && wvReg.canGoBack()) { wvReg.goBack(); return true; } return super.onKeyDown(keyCode, event); } }
хотелось бы использовать именно WebView, а не всяческие post-запросы, так как нужно оставить возможность развития и изменения серверной части (регистрационные данные и внешний вид страниц будет со временем меняться).
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
15.12.2011, 00:50
|
#2
|
Знающий
Регистрация: 14.06.2009
Сообщений: 338
Написано 139 полезных сообщений (для 257 пользователей)
|
Ответ: Как контролировать WebView?
Ох Ступил ты на тёмную сторону силы.
Как же я ненавижу гугл с его долбоандроидом за то, что приходится иногда вытворять, чтобы это дерьмо работало. Наверное разработчики этой шняги трахаются с собаками периодически.
А теперь по теме:
1. В своей активити создаёшь вложенный класс и обзываешь например WebViewInjector
2. Создаёшь в нём метод, пускай
String processBody(String body);
3. Вешаешь свой инъектор на веб вьюху:
webView.addJavascriptInterface(new WebViewInjector(), "WebInjector");
4. Создаёшь WebViewClient и ассайнишь своей веб вьюхе
5. В методе клиента onPageFinished вызываешь следующий код:
webView.loadUrl("javascript:window.WebInjector.processBody(document.getElementsByTagName('body')[0].innerHTML);");
ИТОГО: в методе processBody на входе окажется всё содержимое тега <body> (ну или любого по твоему усмотрению)
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо cyberblut за это полезное сообщение:
|
|
15.12.2011, 17:26
|
#3
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от cyberblut
Ох Ступил ты на тёмную сторону силы. Как же я ненавижу гугл с его долбоандроидом за то, что приходится иногда вытворять, чтобы это дерьмо работало. Наверное разработчики этой шняги трахаются с собаками периодически.
|
сначала прочитал часть фразы "Ступил ты..." и хотел было обидеться, но не смог, потому что действительно ступил, ступая на темную сторону. ибо собак я не люблю, а в сексе придерживаюсь традиционных взглядов, что разработчиками андроида явно не приветствуется.
хочу сказать большое спасибо за решение проблемы, ибо в этом вопросе, похоже ни здравый смысл, ни преподобный гугл на путь истинный наставить меня не смогли бы.
маленький подарок любителям копипаста:
package ru.jru.sru; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; import android.webkit.WebViewClient; public class RegActivity extends Activity { private class WebViewInjector { public String processBody(String body) { // если на странице есть NOT FOUND, то закрываем недобраузер int p = body.toLowerCase().indexOf("not found"); int l = body.length(); if ((p >= 0)&&(p < l)) { finish(); } return body; } } private class wvClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // открываем внешние ссылки в том же недобраузере view.loadUrl(url); return true; } @Override public void onPageFinished (WebView view, String url) { // просматриваем содержимое страницы (в нашем случае секция body) super.onPageFinished(view, url); wvReg.loadUrl("javascript:window.WebInjector.processBody(document.getElementsByTagName('body')[0].innerHTML);"); } } public WebView wvReg; // наш недобраузер public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.regform); wvReg = (WebView)findViewById(R.id.wvReg); wvReg.getSettings().setJavaScriptEnabled(true); wvReg.addJavascriptInterface(new WebViewInjector(), "WebInjector"); wvReg.setWebViewClient(new wvClient()); wvReg.loadUrl("http://www.mysite.ru"); } // возврат на предыдущую страницу по нажатию аппаратной кнопки back public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && wvReg.canGoBack()) { wvReg.goBack(); return true; } return super.onKeyDown(keyCode, event); } }
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.12.2011, 17:17
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Как контролировать WebView?
Можно поинтересоваться, я конечно в этой сфере много не знаю, но вы правы - метод извратный, т.к. изначально вообще черезжоперный.
Почему бы не использовать сокеты, и установить соединение с веб хостом, который выдаст соответствующий код страницы? А потом уже можно этот код кормить в WebView - если такая возможность есть.. ?
|
(Offline)
|
|
16.12.2011, 19:40
|
#5
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от MoKa
Почему бы не использовать сокеты, и установить соединение с веб хостом, который выдаст соответствующий код страницы? А потом уже можно этот код кормить в WebView - если такая возможность есть.. ?
|
если бы меня устраивал такой вариант, я бы воспользовался одним из стандартных способов, кстати вполне хорошо описанных в этом блоге. но практически в каждом из случаев вышло бы куда больше писанины и использовалось бы большее количество методов и классов. хотя... может быть вы и правы, можно еще немного подумать над оптимизацией, пожалуй...
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
16.12.2011, 19:58
|
#6
|
Знающий
Регистрация: 14.06.2009
Сообщений: 338
Написано 139 полезных сообщений (для 257 пользователей)
|
Ответ: Как контролировать WebView?
Через URLConnection можно всё прекрасно забирать. Но и там свои косяки/нюансы есть.
1. Надо открывать тред, тк начиная с 3.0 все сетевые операции нельзя проводить на основном треде (читай синхронно)
2. Если лезть по SSL придётся в 90% случаев лепить свой менеджер сертификатов и разрешать идти на неправильно подписанные хосты
3. WebView довольно часто не может правильно прохавать (особенно объёмный) HTML полученный при loadData(). При чём если пути к CSS/JS относительные, надо не забыть отдать корневой URL
4. Так как могут быть косяки с памятью из-за объёмов страницы, придётся всё писать в темповый файл, потом оттуда отдавать веб вьюхе
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо cyberblut за это полезное сообщение:
|
|
19.12.2011, 22:20
|
#7
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от cyberblut
При чём если пути к CSS/JS относительные, надо не забыть отдать корневой URL
|
а как и кому отдать этот самый URL?
для отображения локальных страниц (динамически создаваемых в строковых переменных или загружаемых из нижеуказанной папки приложения) я использую разметку css, но файлы графики webview естественно не видит.
причем графика (и некоторые страницы в html) сохраняются тут: "/data/data/ru.jru.sru/files/"
этого потребовал класс openFileInput (ничем другим пользоваться у меня пока не получается)
разметка примерно такая:
<style type="text/css"> .msg_container {width: 95%; background-color: #000000; background-color: #ffdd88;} .msg_top_left {height: 10px; background-image: url(ctl.png); background-repeat: no-repeat; background-color: #ffd76b;} .msg_top_right {height: 10px; background-image: url(ctr.png); background-repeat: no-repeat; background-position: right;} .msg_bottom_left {height: 10px; background-image: url(cbl.png); background-repeat: no-repeat; background-color: #ffd76b;} .msg_bottom_right {height: 10px; background-image: url(cbr.png); background-repeat: no-repeat; background-position: right;} .msg_body {padding: 0px 10px 0px 10px;} </style>
, где *.png - уголки пузыря.
может мне просто url(*) поменять как-то? (с учетом положения файлов "/data/data/ru.jru.sru/files/")
з.ы.: пробовал так:
webview.loadDataWithBaseURL("/data/data/ru.jru.sru/files/", htmlCode, "text/html", "utf-8", "");
предварительно накидав в папку все файлы. не помогло
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
20.12.2011, 00:26
|
#8
|
Знающий
Регистрация: 14.06.2009
Сообщений: 338
Написано 139 полезных сообщений (для 257 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от barsunduk
з.ы.: пробовал так:
webview.loadDataWithBaseURL("/data/data/ru.jru.sru/files/", htmlCode, "text/html", "utf-8", "");
предварительно накидав в папку все файлы. не помогло
|
Попробуй так:
webview.loadDataWithBaseURL("file:///data/data/ru.jru.sru/files/", htmlCode, "text/html", "utf-8", "");
Я обычно читаю/пишу через File() + InputStream()/OutputStream().
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.12.2011, 20:06
|
#9
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
спасибо, работает. я этот вариант пробовал, но оказалось, что проблема в css-разметке (даже в png - прозрачные участки накладывались на одноцветный фон и казалось, что картинки не отображаются)
наглость, конечно, но еще вопрос можно?
как WebView пролистать в конец страницы? я такой вариант пробовал:
view.scrollTo(0, view.getContentHeight() - view.getHeight());
и такой:
view.pageDown(true);
и даже такой х_Х:
private class wvLogClient extends WebViewClient { @Override public void onPageFinished (WebView view, String url) { super.onPageFinished(view, url); view.scrollTo(0, view.getContentHeight() - view.getHeight()); } }
разницы, конечно-же никакой.
не листает зараза, остается на месте ..(
вернее пролистывается в конец и тут же возвращается в начало. зачем?
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
20.12.2011, 21:22
|
#10
|
Знающий
Регистрация: 14.06.2009
Сообщений: 338
Написано 139 полезных сообщений (для 257 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от barsunduk
наглость, конечно, но еще вопрос можно?
как WebView пролистать в конец страницы?
|
Ну так для того и форум.
Никогда не скроллил, но как вариант:
webView.loadUrl("javascript:window.scrollTo(0, document.body.scrollHeight);");
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.12.2011, 22:00
|
#11
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
отлично шевелится! а я почти 5 часов убил на поиски ответа в гугле и самостоятельные потуги что-то исправить, а скриптом так и не попробовал (веб-разработкой никогда не занимался, вот и не работает мозг в эту сторону).
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
22.01.2012, 00:38
|
#12
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от cyberblut
Я обычно читаю/пишу через File() + InputStream()/OutputStream().
|
не подскажете, а могу ли я таким способом создать папку для локализации (например "values-ru") и сохранить в нее файл "strings.xml"? хочу переводы с сервера подгружать, чтобы можно было их исправлять и добавлять новые языки уже в процессе использования. уверен, что есть такая возможность, но вот какой путь указывать при создании потока - не "/data/data/package_name/values-ru" случайно?
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
Последний раз редактировалось barsunduk, 22.01.2012 в 02:18.
|
(Offline)
|
|
22.01.2012, 02:31
|
#13
|
Знающий
Регистрация: 14.06.2009
Сообщений: 338
Написано 139 полезных сообщений (для 257 пользователей)
|
Ответ: Как контролировать WebView?
Сообщение от barsunduk
не подскажете, а могу ли я таким способом создать папку для локализации (например "values-ru") и сохранить в нее файл "strings.xml"? хочу переводы с сервера подгружать, чтобы можно было их исправлять и добавлять новые языки уже в процессе использования. уверен, что есть такая возможность, но вот какой путь указывать при создании потока - не "/data/data/package_name/values-ru" случайно?
|
Вот уж не знаю. Не было такой задачи у меня пока. По крайней мере под iOS решал через кастомный класс с выборкой из базовых фалов локализации и/или SQLite. Может под андроидом и предусмотрен какой-нить стандартный механизм, но я не уверен.
|
(Offline)
|
|
22.01.2012, 13:17
|
#14
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Как контролировать WebView?
да, что-то я не то опять ляпнул. если рассуждать чисто логически - id для строковых ресурсов, как я понял, генерируются в классе R при компиляции приложения, так что не должно быть возможности их замены уже в процессе исполнения. тяжело быть чайником ..( ну, буду грузить переменные вручную. тем более есть удобный механизм для хранения настроек Shared Preferences.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:00.
|