我想從Android的網頁中抽取一些東西。我知道有些庫可以解析HTML,但我想也許我可以作一點點的欺騙。在WebView中注入Javascript橋樑
下面是我在做什麼..
- 使用應用程序上下文編程方式創建的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中的日誌和Toast從不顯示。
我試圖做甚至可能嗎?如果是這樣,我做錯了什麼?如果不是,爲什麼不呢?
編輯
停留在測試的UI來看,顯然是爲了使用loadURL第二個電話是行不通的。無論我嘗試注入什麼Javascript,它都不起作用。
EDIT 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
感謝大家的建議,你一直很有幫助,但到目前爲止它還沒有工作,除非有人在接下來的一個小時內提供工作代碼,否則Nainal將獲得一半賞金。如果是這樣,我不確定是否會允許我再次發放獎金,因爲問題仍然沒有得到解決。
以下是我考慮了本頁上的建議並嘗試了幾個我不太瞭解的手冊中的設置後的完整代碼。
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
開始了新的獎金,並增加了獎勵100pts。奈納爾獲得了最有益的最後一筆獎金,並非爲了解決問題。
,很難遵循「問題」。完成這些改進後,目前存在的問題是什麼? –
另有7人瞭解這個問題就好了..查看更多信息的接受答案。 –
我只想追趕和幫助,因爲在我寫作的時候你還沒有一個可以接受的答案,而且信息亂七八糟。希望你也能理解解決方案和根源。 –