android webview的使用

本文详细介绍了如何在Android应用中使用WebView组件加载网页、处理下载、设置cookie以及跨客户端服务器交互的关键步骤。通过示例代码,展示了如何在Android应用中实现网页浏览、本地资源下载和基于HTTP的登录验证功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowserandroidios都有webview。只是其引擎不同,相对于微软的webbrowserandroidioswebview的引擎都是webkit,对Html5提供支持。本篇主要介绍androidwebview之强大。

使用之前需在Androidmanifest中获取权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

主Activity代码:

public class MyActivity extends Activity implements OnClickListener{
    private WebView webView;
    private TextView back,bar_title,refresh;
    private final String baidu_url = "http://m.baidu.com/?from=844b&vit=fps&pu=sz%401321_480&t_noscript=jump";
    private final String down_url = "http://m.shouji.360tpcdn.com/150910/c5aa2b551cd6c292b3ec414441d5ac82/InternetRadio.all_3803.apk";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        back = (TextView) findViewById(R.id.back);
        bar_title = (TextView) findViewById(R.id.bar_title);
        refresh = (TextView) findViewById(R.id.refresh);
        back.setOnClickListener(this);
        refresh.setOnClickListener(this);

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

        webView.loadUrl(baidu_url);
//        webView.loadUrl(down_url);  //加载下载的url,DownloadListener会监听到

        //设置自己程序的webview客户端处理,防止调到浏览器处理
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Toast.makeText(MyActivity.this,url,Toast.LENGTH_SHORT).show();
                Log.e("override_url",url);
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { //处理错误页面
                super.onReceivedError(view, errorCode, description, failingUrl);
                view.loadUrl("file:///android_asset/error.html");//加载assets下的error.html
            }
        });


        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {   //获取标题
                super.onReceivedTitle(view, title);
                bar_title.setText(title);
            }
        });

        webView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                Log.e("down_url", url);
                if(url.endsWith(".apk")) {
                    //调用系统浏览器去下载apk
                    Uri uri = Uri.parse(url);
                    Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                    startActivity(intent);

                    //其他方式,自己写开个线程下载
                }
            }
        });
    }

    @Override
    public void onClick(View v) {
        if(v == back){  //处理回退
            if(webView.canGoBack()){
                webView.goBack();
            }else{
                finish();
            }
        }else if(v == refresh){     //处理刷新
            webView.reload();
        }
    }

    @Override
    public void onBackPressed() {   //处理物理返回键
        if(webView.canGoBack()){
            webView.goBack();
            webView.canGoForward();
            webView.goForward();
        }else{
            super.onBackPressed();
        }
    }
}

本例中webview.loadUrl(down_url)时,DownloadListener会监听到,你可以调用浏览器进行下载或自己实现下载。


效果图:



2.webview设置cookie

关键代码:
private void syncCookie(String cookie){
        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.setCookie(cookie_url, cookie);
        CookieSyncManager.getInstance().sync();
    }

在本例中模拟登陆获取cookie,服务器中相应的servlet是判断有无cookie,无cookie则设置cookie返回,有cookie则重定向到首页。
客户端代码获取cookie:
new AsyncTask<String,Integer,String>(){

            @Override
            protected String doInBackground(String... params) {
                HttpURLConnection url_con = null;
                try {
                    URL url = new URL(params[0]);
                    url_con = (HttpURLConnection) url.openConnection();
                    url_con.connect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(url_con == null){
                    Log.e("url_con","null");
                }
                String cookieVal =url_con.getHeaderField("Set-Cookie");
                return cookieVal;
            }

            @Override
            protected void onPostExecute(String s) {
                Log.e("cookieVal", s);
                Intent intent = new Intent(GetCookieActivity.this,WebviewCookieActivity.class);
                intent.putExtra("cookie",s);
                startActivity(intent);
                super.onPostExecute(s);
            }
        }.execute("http://192.168.1.103:8080/webviewcookie/LoginServlet");
服务器端:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", -1);
		response.setHeader("Pragma", "no-cache");

		// 如果用户第一次访问 ---- 判断请求中有没有cookie信息
		Cookie[] cookies = request.getCookies(); // 获得请求中所有cookie信息

		response.setContentType("text/html;charset=utf-8");

		if(cookies == null){
			Cookie cookie = new Cookie("login", "kedou");
			response.addCookie(cookie);
			response.getWriter().println("登陆");
		}else{
			for(Cookie c: cookies){
				if("login".equals(c.getName())){
					response.sendRedirect("/webviewcookie/HomeServlet");
				}else{
					Cookie cookie = new Cookie("login", "kedou");
					response.addCookie(cookie);
					response.getWriter().println("登陆");
				}
			}
		}
	}


客户端+服务器端源码:http://yunpan.cn/cm7Qk4JVMuRXT (提取码:64d5)


### Android WebView 使用教程 #### 什么是 WebView? `WebView` 是 Android 提供的一个控件,用于在应用内部加载和展示网页内容。它允许开发者嵌入 HTML 页面到应用程序中,并支持 JavaScript 和 CSS 的执行。 --- #### 基本初始化与配置 要使用 `WebView`,首先需要在布局文件中定义该组件: ```xml <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 接着,在 Activity 或 Fragment 中获取并初始化 `WebView` 实例: ```java import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); // 启用JavaScript支持 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 加载URL webView.loadUrl("https://www.example.com"); } } ``` 上述代码展示了如何启用 JavaScript 支持以及加载指定 URL[^1]。 --- #### 数据提交 (POST 请求) 如果需要通过 POST 方法向服务器发送数据,则可以使用以下方式: ```java String postData = "username=admin&password=secret"; webView.postUrl("https://example.com/login", EncodingUtils.getBytes(postData, "base64")); ``` 注意:这里的数据编码应遵循目标服务端的要求[^2]。 --- #### 处理 Cookies 为了处理 cookies,可以通过 `CookieManager` 设置或读取 cookie: ```java import android.webkit.CookieManager; // 添加Cookie CookieManager.getInstance().setCookie("https://example.com", "name=value"); // 获取所有Cookies String allCookies = CookieManager.getInstance().getCookie("https://example.com"); System.out.println(allCookies); ``` 此部分操作有助于保持用户的登录状态或其他个性化设置。 --- #### 清除缓存与历史记录 当用户退出或者切换账户时,可能需要清理 WebView 缓存及相关信息: ```java // 清楚缓存 webView.clearCache(true); // 删除历史记录 webView.clearHistory(); // 移除基本认证凭证 webView.removeJavascriptInterface("interfaceName"); // 如果存在敏感数据存储需求,可进一步调用清除函数 webView.clearFormData(); ``` 需要注意的是,移除 Java 对象接口可能会因不同版本的 Android 而表现不一致^。 --- #### 高级特性 除了基础功能外,`WebView` 还具备更多高级选项,比如手势识别、离线浏览模式等。这些都可以通过调整其设置来实现[^4]: ```java WebSettings webSettings = webView.getSettings(); webSettings.setDomStorageEnabled(true); // 开启DOM storage API webSettings.setDatabaseEnabled(true); // 允许数据库API webSettings.setAppCacheEnabled(true); // 启动应用缓存 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 自适应屏幕宽度 ``` 然而值得注意的一点是,对于 H5 AJAX 请求无法直接拦截修改响应头等内容[^5]。因此某些场景下需借助外部工具完成更复杂的交互逻辑。 --- ### 总结 以上介绍了关于 Android 平台下的 WebView 组件的基础运用技巧及其扩展能力。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值