Я хочу вытащить кое-что с веб-страницы в Android. Я знаю, что есть библиотеки для синтаксического анализа HTML, но я подумал, что, может быть, смогу немного схитрить.
Вот что я делаю ..
- Программно создайте WebView, используя контекст приложения, чтобы его не нужно было отображать в пользовательском интерфейсе.
- Загрузите веб-страницу
- Прикрепите интерфейс JS
- Внедрить Javascript для взаимодействия с основным приложением
Вот код ...
public void getLatestVersion(){
Log.e("Testing", "getLatestVersion called...");
WebView webview = new WebView(context.getApplicationContext());
webview.loadUrl("https://example.com");
webview.addJavascriptInterface(new jsInterface(), "Droid");
webview.loadUrl("javascript: window.onload=function(){ Droid.showToast('testing!'); }");
}
class jsInterface{
@JavascriptInterface
public void showToast(String message){
Log.e("Testing", message);
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}
Поскольку WebView не отображается в пользовательском интерфейсе, трудно сказать, какая часть неисправна. Все, что я знаю, это то, что вызывается первый вызываемый журнал, но журнал и тост из JavascriptInterface никогда не отображаются.
Возможно ли то, что я пытаюсь сделать? Если да, то что я делаю не так? Если нет, то почему?
ИЗМЕНИТЬ
Застрял представление в UI для тестирования, видимо второй вызов loadUrl не работает. Независимо от того, какой Javascript я пытаюсь ввести, это не работает.
ИЗМЕНИТЬ 2
Я чувствую себя глупо из-за того, что забыл включить Javascript, но он все еще не работает .. Я добавил следующие строки ..
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webview.loadUrl("javascript: alert('farts0');");
webview.loadUrl("https://example.com");
setContentView(webview);
String js = "document.body.innerHTML = '<p>test<p>';";
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.evaluateJavascript(js, null);
}else{
webview.loadUrl("javascript: "+js);
}
ИЗМЕНИТЬ 3
Спасибо за все предложения, вы были полезны, но пока он все еще не работает, поэтому, если кто-то не предоставит рабочий код в течение следующего часа, Наинал получит половину награды. Если это так, я не уверен, что мне разрешат назначить за него еще одну награду, поскольку проблема все еще не решена.
Вот мой полный код после того, как я учел предложения на этой странице и попробовал несколько настроек из руководства, которые я действительно не понимаю.
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = new WebView(getApplicationContext());
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
webView.getSettings().setAllowFileAccessFromFileURLs(true);
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
try {
webView.setWebContentsDebuggingEnabled(true);
}catch(Exception e){}
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
webView.setVisibility(View.GONE);
}
@Override
public void onPageFinished(final WebView view, String url) {
Log.e("checking", "MYmsg");
Log.e("content-url", webView.getSettings().getAllowContentAccess()?"y":"n");
webView.loadUrl("javascript: void window.CallToAnAndroidFunction.setVisible(document.getElementsByTagName('body')[0].innerHTML);");
}
});
webView.setVisibility(View.INVISIBLE);
webView.addJavascriptInterface(new myJavaScriptInterface(), "CallToAnAndroidFunction");
webView.loadUrl("http://example.com");
}
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(final String aThing) {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
webView.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Reached JS: "+aThing, Toast.LENGTH_LONG).show();
}
});
}
};handler.postDelayed(runnable,2000);
}}
}
Изменить 4
Началась новая награда и увеличена награда до 100 очков. Наинал получил последнюю награду за то, что был самым полезным, а не за решение проблемы.