精华内容
下载资源
问答
  • WebView中获取网页源码
    2021-06-03 03:55:22

    1. 使能javascript

    webView.getSettings().setJavaScriptEnabled(true);

    2. 编写本地接口

    final class InJavaScriptLocalObj {

    public void showSource(String html) {

    Log.d("HTML", html);

    }

    }

    3. 向网页暴露本地接口

    webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");

    4. 编写自己的WebViewClient,并在onPageFinished中提取网页源码。

    final class MyWebViewClient extends WebViewClient{

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;

    }

    public void onPageStarted(WebView view, String url, Bitmap favicon) {

    Log.d("WebView","onPageStarted");

    super.onPageStarted(view, url, favicon);

    }

    public void onPageFinished(WebView view, String url) {

    Log.d("WebView","onPageFinished ");

    view.loadUrl("javascript:window.local_obj.showSource('

    '+" +

    "document.getElementsByTagName('html')[0].innerHTML+'');");

    super.onPageFinished(view, url);

    }

    }

    5.组合在一起的代码为:

    package com.hi.briancol.htmlsource;

    import android.app.Activity;

    import android.graphics.Bitmap;

    import android.os.Bundle;

    import android.util.Log;

    import android.webkit.WebView;

    import android.webkit.WebViewClient;

    public class HtmlSource extends Activity {

    private WebView webView;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    webView = (WebView)findViewById(R.id.webview);

    webView.getSettings().setJavaScriptEnabled(true);

    webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");

    webView.setWebViewClient(new MyWebViewClient());

    webView.loadUrl("http://www.cnblogs.com/hibraincol/");

    }

    final class MyWebViewClient extends WebViewClient{

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;

    }

    public void onPageStarted(WebView view, String url, Bitmap favicon) {

    Log.d("WebView","onPageStarted");

    super.onPageStarted(view, url, favicon);

    }

    public void onPageFinished(WebView view, String url) {

    Log.d("WebView","onPageFinished ");

    view.loadUrl("javascript:window.local_obj.showSource('

    '+" +

    "document.getElementsByTagName('html')[0].innerHTML+'');");

    super.onPageFinished(view, url);

    }

    }

    final class InJavaScriptLocalObj {

    public void showSource(String html) {

    Log.d("HTML", html);

    }

    }

    }

    6.关键之处在于:

    view.loadUrl("javascript:window.local_obj.showSource('

    '+document.getElementsByTagName('html')[0].innerHTML+'');");

    运行,可以看到在showSource(String html)中打印了网页源码。

    更多相关内容
  • Android组件之Webview实例源码

    千次下载 热门讨论 2012-10-09 14:35:19
    有时候,我们完全可以把UI甚至数据处理都交给WebView,配合PHP等服务端程序,这样Android开发就变成了网页开发,可以省很多精力。 下面是一个WebView的简单例子,如果用把所有功能都交给服务端脚本处理,这个程序...
  • 安卓java获取webview源码概括 这是 Adjust:trade_mark: 的 Android SDK。 您可以在 阅读有关 Adjust:trade_mark: 的更多信息。 用其他语言阅读此内容: , , , 。 目录 快速开始 深层链接 事件追踪 自定义参数 附加的...
  • 第一次尝试用Android Studio 开发的WebView 框架源码;仅供大家学习参考。
  • 本软件主要是基于AndroidWebViewJS的一些应用,输入某个网址的时候,当点击某个应用的时候就会得到相应的值。大家可以看看其代码。学习学习其对应的应用,希望对大家有所帮助。  
  • WebView部分源码概览

    2021-12-16 11:36:37
    Android与JS通过WebView互相调用方法(二者沟通的桥梁是WebView),实际上是: Android去调用JS的代码 JS去调用Android的代码 对于Android调用JS代码的方法有2种: 通过 WebView.loadUrl() 通过 WebView....

    Android与JS通过WebView互相调用方法(二者沟通的桥梁是WebView),实际上是:

    Android去调用JS的代码
    JS去调用Android的代码
    对于Android调用JS代码的方法有2种:

    通过 WebView.loadUrl()
    通过 WebView.evaluateJavascript()
    对于JS调用Android代码的方法有3种:

    通过 WebView.addJavascriptInterface() 进行对象映射
    通过 WebViewClient.shouldOverrideUrlLoading()方法回调拦截 url
    通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息
    使用的示例可以参考:https://developer.android.google.cn/guide/webapps/webview?hl=zh_cn

    跟踪WebView的loadUrl实现的时候,发现在AOSP的代码里面找不到,在网上也基本上找不到相关的说明,大部分是Android与JS互相调用的实例,以及chromium源代码下载、编译,原理实现等,感觉这中间还缺点什么,下方的目标是把这一块给串联起来

    chromium源代码下载、编译
    chromium源代码下载
    代码下载推荐2种方式:

    从gitee上下载 https://github.com/chromium/chromium
    从github上下载 https://github.com/chromium
    我是通过gitee直接下载zip包的,通过git clone命令下载,网速太感人了

    当然有条件的,还是使用官方的提供的depot_tools,可以少踩一些坑

    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    export PATH="$PATH:/path/to/depot_tools"
    mkdir ~/chromium && cd ~/chromium
    fetch --nohooks android
    // 同步对应的平台的依赖编译
    gclient sync
    // 安装额外的编译依赖
    build/install-build-deps-android.sh

    chromium源代码编译
    参考 https://github.com/chromium/chromium/blob/master/docs/android_build_instructions.md

    // 设置编译平台
    target_os = “android”
    target_cpu = “arm64” # See “Figuring out target_cpu” below
    // 启动编译
    autoninja -C out/Default chrome_public_apk

    不同的平台的编译方式不一样,具体的可以看
    https://github.com/chromium/chromium/blob/master/docs/get_the_code.md

    Webview
    源代码路径:
    frameworks/base/core/java/android/webkit/WebView.java

    loadUrl和evaluateJavascript方法的实现比较简单,通过调用WebViewProvider来实现的

    /**
     * Loads the given URL.
     * <p>
     * Also see compatibility note on {@link #evaluateJavascript}.
     *
     * @param url the URL of the resource to load
     */
    public void loadUrl(String url) {
        checkThread();
        mProvider.loadUrl(url);
    }
    
    /**
     * Asynchronously evaluates JavaScript in the context of the currently displayed page.
     * If non-null, {@code resultCallback} will be invoked with any result returned from that
     * execution. This method must be called on the UI thread and the callback will
     * be made on the UI thread.
     * <p>
     * Compatibility note. Applications targeting {@link android.os.Build.VERSION_CODES#N} or
     * later, JavaScript state from an empty WebView is no longer persisted across navigations like
     * {@link #loadUrl(String)}. For example, global variables and functions defined before calling
     * {@link #loadUrl(String)} will not exist in the loaded page. Applications should use
     * {@link #addJavascriptInterface} instead to persist JavaScript objects across navigations.
     *
     * @param script the JavaScript to execute.
     * @param resultCallback A callback to be invoked when the script execution
     *                       completes with the result of the execution (if any).
     *                       May be {@code null} if no notification of the result is required.
     */
    public void evaluateJavascript(String script, @Nullable ValueCallback<String> resultCallback) {
        checkThread();
        mProvider.evaluateJavaScript(script, resultCallback);
    }
    

    WebViewProvider是一个接口,提供了WebView的能力,每个WebView绑定到一个具体的WebViewProvider对象上,这个对象实现了运行时WebView的行为能力

    /**

    • WebView backend provider interface: this interface is the abstract backend to a WebView
    • instance; each WebView object is bound to exactly one WebViewProvider object which implements
    • the runtime behavior of that WebView.
    • All methods must behave as per their namesake in {@link WebView}, unless otherwise noted.
    • @hide Not part of the public API; only required by system implementors.
      */
      @SystemApi
      public interface WebViewProvider

    WebViewProvider是一个接口,具体的实现不在framework里面。最开始的时候,WebView是android framework的一部分,从Android 5.0 (Lollipop)开始,WebView的实现由一个单独的apk来提供,apk 预置在设备里面,可以和普通应用一样更新

    WebView的实现apk的源代码保存在
    https://github.com/chromium/chromium/tree/master/android_webview
    作为Chromium项目代码的一部分,当前AOSP已经不支持从源代码里面编译出WebView

    在AOSP里面,针对不同平台预置了不同版本的WebView APK,适合的apk会默认包含在system image里面。apk文件可以在external/chromium-webview下找到

    具体的说明可以参考
    aosp-system-integration.md

    chromium/android_webview
    https://github.com/chromium/chromium/tree/master/android_webview

    Android WebView是一个android系统组件,用来展示web内容,WebView以及相关的android类都是实现在chromium/android_webview目录下的

    chromium/android_webview目录包含了android WebView的实现,也包含了AndroidX Webkit库的实现

    其中WebViewProvider的实现类是WebViewChromium

    class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate,
    WebViewProvider.ViewDelegate, SmartClipProvider
    1
    2
    类文件路径:

    android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java

    其中loadUrl的实现为

    @Override
    public void loadUrl(final String url) {
        mFactory.startYourEngines(true);
        if (checkNeedsPost()) {
            // Disallowed in WebView API for apps targeting a new SDK
            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
            mFactory.addTask(new Runnable() {
                @Override
                public void run() {
                    mAwContents.loadUrl(url);
                }
            });
            return;
        }
        mAwContents.loadUrl(url);
    }
    

    在这段代码里面,有对android版本号做一个判断,从android 4.4开始,android上的WebView是基于Chromium内核来实现的。最终的实现是调用AwContents.loadUrl

    在AwContents里面,通过逐层调用,最终调用此方法

    /**
     * Load url without fixing up the url string. Consumers of ContentView are responsible for
     * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left
     * off during user input).
     *
     * @param params Parameters for this load.
     */
    @VisibleForTesting
    public void loadUrl(LoadUrlParams params) {
        if (params.getBaseUrl() == null) {
            // Don't record the URL if this was loaded via loadDataWithBaseURL(). That API is
            // tracked separately under Android.WebView.LoadDataWithBaseUrl.BaseUrl.
            recordLoadUrlScheme(schemeForUrl(params.getUrl()));
        }
    
        if (params.getLoadUrlType() == LoadURLType.DATA && !params.isBaseUrlDataScheme()) {
            // This allows data URLs with a non-data base URL access to file:///android_asset/ and
            // file:///android_res/ URLs. If AwSettings.getAllowFileAccess permits, it will also
            // allow access to file:// URLs (subject to OS level permission checks).
            params.setCanLoadLocalResources(true);
            AwContentsJni.get().grantFileSchemeAccesstoChildProcess(
                    mNativeAwContents, AwContents.this);
        }
    
        // If we are reloading the same url, then set transition type as reload.
        if (params.getUrl() != null && params.getUrl().equals(mWebContents.getLastCommittedUrl())
                && params.getTransitionType() == PageTransition.TYPED) {
            params.setTransitionType(PageTransition.RELOAD);
        }
        params.setTransitionType(
                params.getTransitionType() | PageTransition.FROM_API);
    
        // For WebView, always use the user agent override, which is set
        // every time the user agent in AwSettings is modified.
        params.setOverrideUserAgent(UserAgentOverrideOption.TRUE);
    
    
        // We don't pass extra headers to the content layer, as WebViewClassic
        // was adding them in a very narrow set of conditions. See http://crbug.com/306873
        // However, if the embedder is attempting to inject a Referer header for their
        // loadUrl call, then we set that separately and remove it from the extra headers map/
        final String referer = "referer";
        Map<String, String> extraHeaders = params.getExtraHeaders();
        if (extraHeaders != null) {
            for (String header : extraHeaders.keySet()) {
                if (referer.equals(header.toLowerCase(Locale.US))) {
                    params.setReferrer(
                            new Referrer(extraHeaders.remove(header), ReferrerPolicy.DEFAULT));
                    params.setExtraHeaders(extraHeaders);
                    break;
                }
            }
        }
    
        AwContentsJni.get().setExtraHeadersForUrl(mNativeAwContents, AwContents.this,
                params.getUrl(), params.getExtraHttpRequestHeadersString());
        params.setExtraHeaders(new HashMap<String, String>());
    
        // Ideally, the URL would only be "fixed" for user input (e.g. for URLs
        // entered into the Omnibox), but some WebView API consumers rely on
        // the legacy behavior where all navigations were subject to the
        // "fixing".  See also https://crbug.com/1145717.
        params.setUrl(UrlFormatter.fixupUrl(params.getUrl()).getPossiblyInvalidSpec());
    
        mNavigationController.loadUrl(params);
    
        // The behavior of WebViewClassic uses the populateVisitedLinks callback in WebKit.
        // Chromium does not use this use code path and the best emulation of this behavior to call
        // request visited links once on the first URL load of the WebView.
        if (!mHasRequestedVisitedHistoryFromClient) {
            mHasRequestedVisitedHistoryFromClient = true;
            requestVisitedHistoryFromClient();
        }
    }
    

    TBD chromium还是很复杂,目前只有把WebView的启动以及怎么加载到Webview.apk里面的流程大概梳理出来,到具体的绘制的过程,还得好好研究研究

    【一些参考资料】
    WebView的启动过程
    设计的一些关键概念

    最后来一个chromium官方的视频
    Android WebView 101 (Chrome University 2019)

    WebView的层次结构

    WebView的整体框架,android O版本及以上(renderer是一个单独的进程)

    WebView的整体框架,android L到N版本

    展开全文
  • 出于某些场景需要,有时候,我们需要从 WebView 获取源码,本文将简单介绍如何从 WebView 中获取源码,以及遇到的问题的分析和总结。获取源码的方法•WebView 没有提供直接获...

    出于某些场景需要,有时候,我们需要从 WebView 获取源码,本文将简单介绍如何从 WebView 中获取源码,以及遇到的问题的分析和总结。

    获取源码的方法

    •WebView 没有提供直接获取网页源码的方法•我们需要使用Javascript 的方法来获取源码,具体的核心代码如下

    function() {
        var content = document.getElementsByTagName('html')[0].innerHTML;
        return '<html>' + content + '</html>';
    })
    

    获取时机

    •为了确保源码完整,建议放在onPageFinished(即网页加载完毕时)时机。

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            webView.settings.javaScriptEnabled = true
    
            webView.webViewClient = object: WebViewClient() {
                override fun onPageFinished(view: WebView?, url: String?) {
                    Log.i("GetPageSourceCode", "onPageFinished url=$url")
                    super.onPageFinished(view, url)
                    parseSourceCode(webView)
                }
    
            }
    
            webView.webChromeClient = object: WebChromeClient() {
                override fun onProgressChanged(view: WebView?, newProgress: Int) {
                    super.onProgressChanged(view, newProgress)
                    Log.i("GetPageSourceCode", "onProgressChanged newProgress=$newProgress")
                }
            }
    
            webView.loadUrl("http://10.185.240.240:8000/")
    }
    

    解析处理源码

    •这里我们获取并打印所有的<a>元素

    private fun parseSourceCode(webView: WebView) {
            webView.evaluateJavascript("""
                        (function() {
                            var content = document.getElementsByTagName('html')[0].innerHTML;
                            return '<html>' + content + '</html>';
                        })();""".trimIndent()) {
                            Log.i("GetPageSourceCode", it)
                            printATagElements(it)
    
    
            }
    }
    
    
    private fun printATagElements(htmlString: String?) {
            htmlString ?: return
            val document = Jsoup.parse(htmlString)
            document.select("a").joinToString().let {
                Log.i("GetPageSourceCode", "ATag.content=$it")
            }
        }
    

    问题来了

    打印出来一堆这样的网页源码, 无法进行Jsoup解析

    "\u003Chtml>\u003Chead>\n \u003Ctitle>Index of /\u003C/title>\n \u003Cstyle type="text/css">\n \u003C!--\n .name, .mtime { text-align: left; }\n .size { text-align: right; }\n td { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }\n table { border-collapse: collapse; }\n tr th { border-bottom: 2px groove; }\n //-->\n \u003C/style>\n \u003C/head>\n \u003Cbody>\n \u003Ch1>Index of /\u003C/h1>\n\u003Ctable width="100%">\u003Cthead>\u003Ctr>\n\u003Cth class="name">\u003Ca href="?N=D">Name\u003C/a>\u003C/th>\u003Cth class="mtime">\u003Ca href="?M=D">Last modified\u003C/a>\u003C/th>\u003Cth class="size">\u003Ca href="?S=D">Size\u003C/a>\u003C/th>\n\u003C/tr>\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="..">Parent Directory\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/01/05 11:08\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="8.0.27_first/">8.0.27_first/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/15 19:37\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="8.0.27_second/">8.0.27_second/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/16 15:43\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="8.0.28_first/">8.0.28_first/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/20 08:35\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="8.0.28_second.tar.bz2">8.0.28_second.tar.bz2\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/20 18:54\u003C/td>\u003Ctd class="size">8287826524\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="8.0.28_second/">8.0.28_second/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/20 14:25\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="archive/">archive/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/15 14:06\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="channel">channel\u003C/a>\u003C/td>\u003Ctd class="mtime">2020/06/05 18:10\u003C/td>\u003Ctd class="size">10\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="huawei_channel/">huawei_channel/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/15 14:18\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="huawei_channel_second/">huawei_channel_second/\u003C/a>\u003C/td>\u003Ctd class="mtime">2021/04/16 11:14\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="nohup.out">nohup.out\u003C/a>\u003C/td>\u003Ctd class="mtime">2019/12/20 13:48\u003C/td>\u003Ctd class="size">14003\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="seperate_apks/">seperate_apks/\u003C/a>\u003C/td>\u003Ctd class="mtime">2020/06/05 18:14\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="temp_master_batch_build/">temp_master_batch_build/\u003C/a>\u003C/td>\u003Ctd class="mtime">2020/12/04 17:46\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd class="name">\u003Ca href="trash/">trash/\u003C/a>\u003C/td>\u003Ctd class="mtime">2020/04/29 12:19\u003C/td>\u003Ctd class="size">-\u003C/td>\u003C/tr>\n\u003C/tbody>\u003C/table>\u003Chr> \u003Caddress>\n WEBrick/1.4.2 (Ruby/2.5.5/2019-03-15)\u003Cbr>\n at 10.185.240.240:8000\n \u003C/address>\n \n\n\u003C/body>\u003C/html>"

    怎么处理

    将获取的源码进行unescape 即可。

    StringEscapeUtils.unescapeEcmaScript(rawString)
    

    注意,StringEscapeUtils来自依赖库commons-text

    implementation group: 'org.apache.commons', name: 'commons-text', version: '1.9'
    

    处理后的结果

    <html><head>
        <title>Index of /</title>
        <style type="text/css">
        <!--
        .name, .mtime { text-align: left; }
        .size { text-align: right; }
        td { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
        table { border-collapse: collapse; }
        tr th { border-bottom: 2px groove; }
        //-->
        </style>
      </head>
      <body>
        <h1>Index of /</h1>
    <table width="100%"><thead><tr>
    <th class="name"><a href="?N=D">Name</a></th><th class="mtime"><a href="?M=D">Last modified</a></th><th class="size"><a href="?S=D">Size</a></th>
    </tr></thead>
    <tbody>
    <tr><td class="name"><a href="..">Parent Directory</a></td><td class="mtime">2021/01/05 11:08</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="8.0.27_first/">8.0.27_first/</a></td><td class="mtime">2021/04/15 19:37</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="8.0.27_second/">8.0.27_second/</a></td><td class="mtime">2021/04/16 15:43</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="8.0.28_first/">8.0.28_first/</a></td><td class="mtime">2021/04/20 08:35</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="8.0.28_second.tar.bz2">8.0.28_second.tar.bz2</a></td><td class="mtime">2021/04/20 18:54</td><td class="size">8287826524</td></tr>
    <tr><td class="name"><a href="8.0.28_second/">8.0.28_second/</a></td><td class="mtime">2021/04/20 14:25</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="archive/">archive/</a></td><td class="mtime">2021/04/15 14:06</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="channel">channel</a></td><td class="mtime">2020/06/05 18:10</td><td class="size">10</td></tr>
    <tr><td class="name"><a href="huawei_channel/">huawei_channel/</a></td><td class="mtime">2021/04/15 14:18</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="huawei_channel_second/">huawei_channel_second/</a></td><td class="mtime">2021/04/16 11:14</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="nohup.out">nohup.out</a></td><td class="mtime">2019/12/20 13:48</td><td class="size">14003</td></tr>
    <tr><td class="name"><a href="seperate_apks/">seperate_apks/</a></td><td class="mtime">2020/06/05 18:14</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="temp_master_batch_build/">temp_master_batch_build/</a></td><td class="mtime">2020/12/04 17:46</td><td class="size">-</td></tr>
    <tr><td class="name"><a href="trash/">trash/</a></td><td class="mtime">2020/04/29 12:19</td><td class="size">-</td></tr>
    </tbody></table><hr>    <address>
         WEBrick/1.4.2 (Ruby/2.5.5/2019-03-15)<br>
         at 10.185.240.240:8000
        </address>
    
    
    </body></html>
    

    为什么 使用 WebView 获取源码

    •WebView 相对 其他的 Http Client 库,支持运行 Javascript 得到的源码相对来说更完整。

    展开全文
  • 安卓java获取webview源码 适用于 Android 的 Microsoft 身份验证库 (MSAL) 适用于 Android 的 MSAL 库使您的应用程序能够通过使用行业标准 OAuth2 和 OpenID Connect 支持并在融合体验中使用 。 该库还支持 . 介绍 ...
  • package ...import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.graphics.Bitmap;import android.net.Uri;im...

    package com.example.bajian.webviewuploaddemo;

    import android.app.Activity;

    import android.content.Intent;

    import android.content.res.Configuration;

    import android.graphics.Bitmap;

    import android.net.Uri;

    import android.os.Bundle;

    import android.view.View;

    import android.webkit.ValueCallback;

    import android.webkit.WebChromeClient;

    import android.webkit.WebView;

    import android.webkit.WebViewClient;

    import android.widget.ProgressBar;

    /**

    * 网上找的webview设置,自己写的链接测试下网页文件上传

    */

    public class MainActivity extends Activity {

    WebView web;

    ProgressBar progressBar;

    private ValueCallback mUploadMessage;

    private final static int FILECHOOSER_RESULTCODE=1;

    @Override

    protected void onActivityResult(int requestCode, int resultCode,

    Intent intent) {

    if(requestCode==FILECHOOSER_RESULTCODE)

    {

    if (null == mUploadMessage) return;

    Uri result = intent == null || resultCode != RESULT_OK ? null

    : intent.getData();

    mUploadMessage.onReceiveValue(result);

    mUploadMessage = null;

    }

    }

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    web = (WebView) findViewById(R.id.webview01);

    progressBar = (ProgressBar) findViewById(R.id.progressBar1);

    web = new WebView(this);

    web.getSettings().setJavaScriptEnabled(true);

    web.loadUrl("http://bxj.snewfly.com/web_upload_demo/upload.html");

    web.setWebViewClient(new myWebClient());

    web.setWebChromeClient(new WebChromeClient()

    {

    //The undocumented magic method override

    //Eclipse will swear at you if you try to put @Override here

    // For Android 3.0

    public void openFileChooser(ValueCallback uploadMsg) {

    mUploadMessage = uploadMsg;

    Intent i = new Intent(Intent.ACTION_GET_CONTENT);

    i.addCategory(Intent.CATEGORY_OPENABLE);

    i.setType("image/*");

    MainActivity.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);

    }

    // For Android 3.0

    public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {

    mUploadMessage = uploadMsg;

    Intent i = new Intent(Intent.ACTION_GET_CONTENT);

    i.addCategory(Intent.CATEGORY_OPENABLE);

    i.setType("*/*");

    MainActivity.this.startActivityForResult(

    Intent.createChooser(i, "File Browser"),

    FILECHOOSER_RESULTCODE);

    }

    //For Android 4.1

    public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture){

    mUploadMessage = uploadMsg;

    Intent i = new Intent(Intent.ACTION_GET_CONTENT);

    i.addCategory(Intent.CATEGORY_OPENABLE);

    i.setType("*/*");

    // i.setType("image/*");

    MainActivity.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MainActivity.FILECHOOSER_RESULTCODE );

    }

    });

    setContentView(web);

    }

    public class myWebClient extends WebViewClient

    {

    @Override

    public void onPageStarted(WebView view, String url, Bitmap favicon) {

    // TODO Auto-generated method stub

    super.onPageStarted(view, url, favicon);

    }

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    // TODO Auto-generated method stub

    view.loadUrl(url);

    return true;

    }

    @Override

    public void onPageFinished(WebView view, String url) {

    // TODO Auto-generated method stub

    super.onPageFinished(view, url);

    progressBar.setVisibility(View.GONE);

    }

    }

    //flipscreen not loading again

    @Override

    public void onConfigurationChanged(Configuration newConfig){

    super.onConfigurationChanged(newConfig);

    }

    // To handle "Back" key press event for WebView to go back to previous screen.

    /*@Override

    public boolean onKeyDown(int keyCode, KeyEvent event)

    {

    if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {

    web.goBack();

    return true;

    }

    return super.onKeyDown(keyCode, event);

    }*/

    }

    需2积分下载

    https://www.codedown123.com/33526.html

    展开全文
  • 文件main.javapackage com.HHBrowser.android;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;...import android.webkit.WebView;i...
  • 本篇内容主要给大家讲解了Android Webview拦截ajax请求的详细讲解,需要的朋友一起来学习一下。
  • 通过android调用JS方法获取HTML标签等源码,核心代码就一行: view.loadUrl("javascript:window.local_obj.showSource('<head>'+" + "document.getElementsByTagName('html')[0].innerHTML+'</head>'...
  • 安卓java获取webview源码 R11-Android-SDK 项目各个模块支持gradle引入 rbridge的导入 implementation 'org.rainboweleven:rbridge:$versionName' 查看各模块最新$versionName版本到: #Rainboweleven Android 使用...
  • 安卓java获取webview源码 注意:截至 2016 年,所有现代 Web 视图都内置了良好的 WebGL 支持,因此这不再有用。 这被认为是 2011 年的疯狂黑客攻击。 WebGLGap - 在 PhoneGap 中启用 WebGL 关于 目前,HTML5 游戏在...
  • 一.添加权限 二.js调用android代码 1.需要写一个java对js方法的映射 public class AndroidToJS { // 定义JS需要调用的方法 // 被JS调用的方法必须加入@...2.activitiy类,webview设置,把接口方法添
  • Android WebViewJS应用源码.zip项目安卓应用源码下载Android WebViewJS应用源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
  • Android应用源码安卓源码(172个合集),可以做为你的学习参考。 365MobileSecretary v1.0.6(365手机助手AIDL) 888个经典 Logo.rar AdXmpp(Openfire+asmack+spark) .zip AidlDemo(简单aidl的例子) aidl跨进程调用....
  • 比如chrome浏览器 ,用手机模式调试出来的不是正真在移动设备上 运行之后的效果,但是我们要看到在移动端运行之后的源码标签 。 我们需要有一款插件或者功能可以看到代码标签。从而更好的定位和调试网页。
  • 主要介绍了Android WebView无法弹出软键盘的原因及解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • webview获取html源码

    2015-08-23 21:27:56
    webview获取html源码,解析xml,完成 html和webview的交互。
  • 封装WebView

    2018-10-18 09:36:31
    PrimWeb 是一个代理的WebView基于的 Android WebView 和 腾讯 x5 WebView,容易、灵活使用以及功能非常强大的库,提供了 WebView 一系列的问题解决方案 ,并且轻量和灵活, 更方便 webview 的切换
  • Android WebView获取源码

    2014-08-30 16:11:40
    Android使用WebView获取网页的源码,将WebView封装进ArthurWebView,直接创建并初始化即可使用!
  • 安卓java获取webview源码 :warning: :warning: :warning: [ 已弃用 ] :warning: :warning: :warning: :backhand_index_pointing_right: 请使用由 React Native 社区维护的 。 React Native Android WebView 文件上传...
  • 安卓java获取webview源码适用于 Android 的 Turbo Native 注意: Hotwire 框架以测试版形式提供。 我们正在与 HEY 一起在生产中使用它们,但预计可能会根据早期反馈做出重大更改。 :victory_hand: :red_heart: 使用...
  • android WebView详解,常见漏洞详解和安全源码(上)

    万次阅读 多人点赞 2017-02-12 18:19:55
    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及... 下篇:android WebView详解,常见漏洞详解和安全源码(下)  转载请注明出处:http://blog.c
  • AndroidWebView 这是一个学习Android WebView的开源项目,涉及到WebView的基本用法、功能优化和常见问题的解决方案等等 博客文章 Android WebView相关材料汇总 项目功能 自定义网页错误界面 获取手机本地文件 ...
  • android_external_chromium-webview
  • 安卓java获取webview源码3DSView (D3SView :) ,又名 3D Secure WebView 用于处理 Android 应用程序中银行 3D Secure(MasterCard SecureCode / Verified By Visa)支付授权的独立 UI 组件。 为什么是“D3S”? 仅仅...
  • 安卓Android源码——WebViewJS.zip
  • 如何更新Android源码中的Webview内核

    千次阅读 2020-04-26 15:07:40
    0 前言 ...如何更新Android源码中的Webview内核呢?Android4.4以后,Webview独立出了一个系统apk,在/system/app/下,包名是com.android.webview 然而Google新出的Webview apk包名是com.google...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,361
精华内容 6,944
关键字:

安卓webview源码