Hướng dẫn get html from webview android - lấy html từ webview android

Phương pháp nào đơn giản nhất để lấy mã HTML từ WebView? Tôi đã thử một số phương thức từ Stackoverflow và Google, nhưng không thể tìm thấy một phương thức chính xác. Vui lòng đề cập đến một cách chính xác.

public class htmldecoder extends Activity implements OnClickListener,TextWatcher
{
TextView txturl;
Button btgo;
WebView wvbrowser;
TextView txtcode;
ImageButton btcode;
LinearLayout llayout;
int flagbtcode;
public void onCreate[Bundle savedInstanceState]
{
            super.onCreate[savedInstanceState];
                setContentView[R.layout.htmldecoder];

    txturl=[TextView]findViewById[R.id.txturl];

    btgo=[Button]findViewById[R.id.btgo];
    btgo.setOnClickListener[this];

    wvbrowser=[WebView]findViewById[R.id.wvbrowser];
    wvbrowser.setWebViewClient[new HelloWebViewClient[]];
    wvbrowser.getSettings[].setJavaScriptEnabled[true];
    wvbrowser.getSettings[].setPluginsEnabled[true];
    wvbrowser.getSettings[].setJavaScriptCanOpenWindowsAutomatically[true];
    wvbrowser.addJavascriptInterface[new MyJavaScriptInterface[],"HTMLOUT"];
    //wvbrowser.loadUrl["//www.google.com"];
    wvbrowser.loadUrl["javascript:window.HTMLOUT.showHTML[''+document.getElementsByTagName['html'][0].innerHTML+''];"];


    txtcode=[TextView]findViewById[R.id.txtcode];
    txtcode.addTextChangedListener[this];

    btcode=[ImageButton]findViewById[R.id.btcode];
    btcode.setOnClickListener[this];

    }

public void onClick[View v]
{
    if[btgo==v]
    {
        String url=txturl.getText[].toString[];
        if[!txturl.getText[].toString[].contains["//"]]
        {
            url="//"+url;
        }
        wvbrowser.loadUrl[url];
        //wvbrowser.loadData["
","text/html","utf-8"]; } else if[btcode==v] { ViewGroup.LayoutParams params1=wvbrowser.getLayoutParams[]; ViewGroup.LayoutParams params2=txtcode.getLayoutParams[]; if[flagbtcode==1] { params1.height=200; params2.height=220; flagbtcode=0; //txtcode.setText[wvbrowser.getContentDescription[]]; } else { params1.height=420; params2.height=0; flagbtcode=1; } wvbrowser.setLayoutParams[params1]; txtcode.setLayoutParams[params2]; } } public class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading[WebView view, String url] { view.loadUrl[url]; return true; } /*@Override public void onPageFinished[WebView view, String url] { // This call inject JavaScript into the page which just finished loading. wvbrowser.loadUrl["javascript:window.HTMLOUT.processHTML[''+document.getElementsByTagName['html'][0].innerHTML+''];"]; }*/ } class MyJavaScriptInterface { @SuppressWarnings["unused"] public void showHTML[String html] { txtcode.setText[html]; } } public void afterTextChanged[Editable s] { // TODO Auto-generated method stub } public void beforeTextChanged[CharSequence s, int start, int count, int after] { // TODO Auto-generated method stub } public void onTextChanged[CharSequence s, int start, int before, int count] { wvbrowser.loadData["
","text/html","utf-8"]; } }

Hope4You

1.9174 Huy hiệu vàng21 Huy hiệu bạc44 Huy hiệu đồng4 gold badges21 silver badges44 bronze badges

Đã hỏi ngày 20 tháng 11 năm 2011 lúc 10:36Nov 20, 2011 at 10:36

0

Trên thực tế câu hỏi này có nhiều câu trả lời. Đây là 2 người trong số họ:

public class TestActivity extends Activity {

    @Override
    protected void onCreate[Bundle savedInstanceState] {
        super.onCreate[savedInstanceState];
        setContentView[R.layout.webview];
        final WebView webview = [WebView] findViewById[R.id.browser];
        webview.getSettings[].setJavaScriptEnabled[true];
        webview.addJavascriptInterface[new MyJavaScriptInterface[this], "HtmlViewer"];

        webview.setWebViewClient[new WebViewClient[] {
            @Override
            public void onPageFinished[WebView view, String url] {
                webview.loadUrl["javascript:window.HtmlViewer.showHTML" +
                        "[''+document.getElementsByTagName['html'][0].innerHTML+''];"];
            }
        }];

        webview.loadUrl["//android-in-action.com/index.php?post/" +
                "Common-errors-and-bugs-and-how-to-solve-avoid-them"];
    }

    class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface[Context ctx] {
            this.ctx = ctx;
        }

        public void showHTML[String html] {
            new AlertDialog.Builder[ctx].setTitle["HTML"].setMessage[html]
                    .setPositiveButton[android.R.string.ok, null].setCancelable[false].create[].show[];
        }

    }
}

Bằng cách này, bạn lấy HTML thông qua JavaScript. Không phải là cách đẹp nhất nhưng khi bạn có giao diện JavaScript của mình, bạn có thể thêm các phương thức khác để sửa nó.

Tùy chọn bạn chọn cũng phụ thuộc, tôi nghĩ, vào những gì bạn dự định làm với HTML đã truy xuất ...

Đã trả lời ngày 20 tháng 11 năm 2011 lúc 11:41Nov 20, 2011 at 11:41

SephysephySephy

49.6K30 Huy hiệu vàng121 Huy hiệu bạc130 Huy hiệu đồng30 gold badges121 silver badges130 bronze badges

13

Trong KitKat trở lên, bạn có thể sử dụng phương thức

public class TestActivity extends Activity {

    @Override
    protected void onCreate[Bundle savedInstanceState] {
        super.onCreate[savedInstanceState];
        setContentView[R.layout.webview];
        final WebView webview = [WebView] findViewById[R.id.browser];
        webview.getSettings[].setJavaScriptEnabled[true];
        webview.addJavascriptInterface[new MyJavaScriptInterface[this], "HtmlViewer"];

        webview.setWebViewClient[new WebViewClient[] {
            @Override
            public void onPageFinished[WebView view, String url] {
                webview.loadUrl["javascript:window.HtmlViewer.showHTML" +
                        "[''+document.getElementsByTagName['html'][0].innerHTML+''];"];
            }
        }];

        webview.loadUrl["//android-in-action.com/index.php?post/" +
                "Common-errors-and-bugs-and-how-to-solve-avoid-them"];
    }

    class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface[Context ctx] {
            this.ctx = ctx;
        }

        public void showHTML[String html] {
            new AlertDialog.Builder[ctx].setTitle["HTML"].setMessage[html]
                    .setPositiveButton[android.R.string.ok, null].setCancelable[false].create[].show[];
        }

    }
}
3 trên WebView

wvbrowser.evaluateJavascript[
        "[function[] { return [''+document.getElementsByTagName['html'][0].innerHTML+'']; }][];",
         new ValueCallback[] {
            @Override
            public void onReceiveValue[String html] {
                Log.d["HTML", html]; 
                // code here
            }
    }];

Xem câu trả lời này để biết thêm ví dụ

Đã trả lời ngày 16 tháng 8 năm 2015 lúc 22:30Aug 16, 2015 at 22:30

AkashakashAkash

12.1k1 Huy hiệu vàng23 Huy hiệu bạc19 Huy hiệu đồng1 gold badge23 silver badges19 bronze badges

7

Đối với Android 4.2, đừng quên thêm @javascriptinterface vào tất cả các chức năng JavaScript

Danronmoon

3.7145 huy hiệu vàng33 Huy hiệu bạc56 Huy hiệu đồng5 gold badges33 silver badges56 bronze badges

Đã trả lời ngày 27 tháng 3 năm 2013 lúc 15:35Mar 27, 2013 at 15:35

user1842354user1842354user1842354

5614 Huy hiệu bạc5 Huy hiệu Đồng4 silver badges5 bronze badges

1

Android Webview chỉ là một công cụ kết xuất khác hiển thị nội dung HTML được tải xuống từ máy chủ HTTP, giống như Chrome hoặc Firefox. Tôi không biết lý do tại sao bạn cần lấy trang được hiển thị [hoặc ảnh chụp màn hình] từ WebView. Trong hầu hết các tình huống, điều này là không cần thiết. Bạn luôn có thể nhận được nội dung HTML thô từ máy chủ HTTP trực tiếp.

Đã có những câu trả lời được đăng trên mạng về việc lấy luồng thô bằng cách sử dụng httpurlconnection hoặc httpclient. Ngoài ra, có một thư viện rất tiện dụng khi xử lý phân tích/quy trình nội dung HTML trên Android: JSoup, nó cung cấp API rất đơn giản để có được nội dung HTML Mẫu HTTP và cung cấp một biểu diễn trừu tượng của tài liệu HTML để giúp chúng tôi quản lý phân tích HTML không chỉ theo phong cách OO hơn nhưng cũng dễ dàng:

// Single line of statement to get HTML document from HTTP server.
Document doc = Jsoup.connect["//en.wikipedia.org/"].get[];

Nó rất tiện dụng khi, ví dụ, bạn muốn tải xuống tài liệu HTML trước sau đó thêm một số CSS hoặc JavaScript tùy chỉnh cho nó trước khi chuyển nó cho WebView để kết xuất. Nhiều hơn nữa trên trang web chính thức của họ, đáng để kiểm tra nó.

Đã trả lời ngày 7 tháng 3 năm 2012 lúc 21:45Mar 7, 2012 at 21:45

Yorkwyorkwyorkw

40.7k10 Huy hiệu vàng116 Huy hiệu bạc130 Huy hiệu đồng10 gold badges116 silver badges130 bronze badges

1

Một điểm chạm tôi thấy rằng cần phải được đưa vào vị trí là "ẩn" đi trong cấu hình proguard. Mặc dù đầu đọc HTML gọi qua giao diện JavaScript rất tốt khi gỡ lỗi ứng dụng, nhưng điều này không còn hoạt động ngay khi ứng dụng được chạy qua Proguard, trừ khi hàm đọc HTML được khai báo trong tệp cấu hình proguard, như vậy:

-keepclassmembers class  {
    public *; 
}

Đã thử nghiệm và xác nhận trên Android 2.3.6, 4.1.1 và 4.2.1.

Đã trả lời ngày 13 tháng 1 năm 2013 lúc 19:17Jan 13, 2013 at 19:17

Android sẽ không cho phép bạn làm điều này cho những lo ngại về bảo mật. Một nhà phát triển độc ác có thể rất dễ dàng đánh cắp thông tin đăng nhập do người dùng nhập vào.

Thay vào đó, bạn phải bắt được văn bản đang được hiển thị trong WebView trước khi nó được hiển thị. Nếu bạn không muốn thiết lập một trình xử lý phản hồi [theo các câu trả lời khác], tôi đã tìm thấy bản sửa lỗi này với một số googling:

URL url = new URL["//stackoverflow.com/questions/1381617"];
URLConnection con = url.openConnection[];
Pattern p = Pattern.compile["text/html;\\s+charset=[[^\\s]+]\\s*"];
Matcher m = p.matcher[con.getContentType[]];
/* If Content-Type doesn't match this pre-conception, choose default and 
 * hope for the best. */
String charset = m.matches[] ? m.group[1] : "ISO-8859-1";
Reader r = new InputStreamReader[con.getInputStream[], charset];
StringBuilder buf = new StringBuilder[];
while [true] {
  int ch = r.read[];
  if [ch < 0]
    break;
  buf.append[[char] ch];
}
String str = buf.toString[];

Đây là rất nhiều mã và bạn sẽ có thể sao chép/đánh cắp nó và vào cuối nó

public class TestActivity extends Activity {

    @Override
    protected void onCreate[Bundle savedInstanceState] {
        super.onCreate[savedInstanceState];
        setContentView[R.layout.webview];
        final WebView webview = [WebView] findViewById[R.id.browser];
        webview.getSettings[].setJavaScriptEnabled[true];
        webview.addJavascriptInterface[new MyJavaScriptInterface[this], "HtmlViewer"];

        webview.setWebViewClient[new WebViewClient[] {
            @Override
            public void onPageFinished[WebView view, String url] {
                webview.loadUrl["javascript:window.HtmlViewer.showHTML" +
                        "[''+document.getElementsByTagName['html'][0].innerHTML+''];"];
            }
        }];

        webview.loadUrl["//android-in-action.com/index.php?post/" +
                "Common-errors-and-bugs-and-how-to-solve-avoid-them"];
    }

    class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface[Context ctx] {
            this.ctx = ctx;
        }

        public void showHTML[String html] {
            new AlertDialog.Builder[ctx].setTitle["HTML"].setMessage[html]
                    .setPositiveButton[android.R.string.ok, null].setCancelable[false].create[].show[];
        }

    }
}
4 sẽ chứa cùng một HTML được rút ra trong WebView. Câu trả lời này là từ cách đơn giản nhất để tải chính xác HTML từ trang web vào một chuỗi trong Java và nó cũng sẽ hoạt động trên Android. Tôi đã không kiểm tra điều này và không tự viết nó, nhưng nó có thể giúp bạn ra ngoài.

Ngoài ra, URL này đang kéo được mã hóa cứng, vì vậy bạn sẽ phải thay đổi điều đó.

Đã trả lời ngày 18 tháng 2 năm 2012 lúc 18:31Feb 18, 2012 at 18:31

Edthethethirdthethethirdedthethird

6.2632 Huy hiệu vàng23 Huy hiệu bạc34 Huy hiệu đồng2 gold badges23 silver badges34 bronze badges

with[webView] {
    settings.javaScriptEnabled = true
    webViewClient = object : WebViewClient[] {
        override fun onPageFinished[view: WebView?, url: String?] {
            view?.evaluateJavascript["document.documentElement.outerHTML"] {
                val html = it.replace["\\u003C", "

Bài Viết Liên Quan

Chủ Đề