Android接入WebView(一)——基本用法

Android接入WebView(一)——基本用法

Android接入WebView(二)——与JavaScript交互

Android接入WebView(三)——浏览器书签与历史记录与二维码分享

Android接入WebView(四)——浏览器书签与历史记录详细处理

Android接入WebView(五)——浏览器制作总结及源码分享

最近写了一个基于webview和zxing,sqlite实现的一款浏览器

主要功能有:扫描二维码以及打开本地二维码加载网页,书签和历史记录管理,无痕浏览,分享网址,分享网址二维码,浏览器出错自定义等功能。

源码地址:此资源解压后用Android可直接打开

在Android中,WebView是一种用来呈现网页内容的视图控件。与其他视图一样,它可以占据全屏也可以只占用activity的一部分。

(1)构造WebView

先在布局文件中定义一个WebView控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
 

(2)记得配置AndroidManifest.xml 网络权限:

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

(3)然后在activity中申明:

WebView webView=(WebView)findViewById(R.id.webview);
webView.loadUrl("https://blog.csdn.net/mountain_hua");

然后运行,发现并未显示网页,检查发现Android monitor里出现了

Denied starting an intent without a user gesture

意思是没有用户的主动手势,不能自动开始一个intent

先说解决方法:

方法一:给webVie设置如下:

webView.setWebViewClient(new WebViewClient());

方法二:或者给用户增加一个手势,比如通过点击Button打开这个网页

我用的方法一,再点击运行后,出现了在下的博客。webview使用成功。

那么为什么会出现

Denied starting an intent without a user gesture        

查询官方文档:

 

  1. From newest androids, the WebView and Chrome Client is separated application which can be automatically updated without user intention.

  2. From Chrome x >= 25 version, they changed how loading url is working in android application which is using webview component. https://developer.chrome.com/multidevice/android/intentsLooks like they are blocking changing url without user gesture and launched from JavaScript timers

 

Solution here is to force user to activate URL change, for example on button click.

Also, you can override method mentioned above "shouldOverrideUrlLoading" in WebView client.

第一条说最新的androids可以不用获得用户的intent,就能自动打开一个webview。

第二条说当Chrome版本大于等于25时,就需要用户的intent了。

解决方法就是我说的那两种:(1)通过Button打开。(2)重写shouldOverrideUrlLoading方法。即:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;                
    }
});

 

前进返回刷新:

package mountain_hua.learn_webview1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final WebView webView=(WebView)findViewById(R.id.webview);
        webView.loadUrl("https://blog.csdn.net/mountain_hua");
        webView.setWebViewClient(new WebViewClient());
        Button b1=(Button)findViewById(R.id.button);
        Button b2=(Button)findViewById(R.id.button2);
        Button b3=(Button)findViewById(R.id.button3);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //返回
                webView.goBack();
            }
        });
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //重新加载
                webView.reload();
            }
        });
        b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //前进
                webView.goForward();
            }
        });


    }
}

 

 

 

附常用方法:(常用方法参考了https://blog.csdn.net/u012322710/article/details/52789818

WebSetting常用方法


setDomStorageEnabled             开启缓存
setAllowFileAccess                  启用或禁用WebView访问文件数据
setBlockNetworkImage          是否显示网络图像
setBuiltInZoomControls         设置是否支持缩放 
setCacheMode                       设置缓冲的模式
setDefaultFontSize                 设置默认的字体大小
setDefaultTextEncodingName 设置在解码时时候用的默认编码
setFixedFontFamily                 设置固定使用的字体
setJavaScriptEnabled                 设置是否支持Javascript
setLayoutAlgorithm                 设置布局方式
setLightTouchEnabled         设置用鼠标激活被选项
setSupportZoom                         设置是否支持变焦



WebViewClient常用方法


doUpdateVisitedHistory 更新历史记录
onFormResubmission 应用程序重新请求网页数据
onLoadResource        加载指定地址提供的资源
onPageFinished                网页加载完毕
onPageStarted                网页开始加载
onReceivedError                报告错误信息
onScaleChanged        当WebView发生改变
shouldOverrideUrlLoading 控制新的连接在当前WebView中打开

与javascript交互见:Android接入WebView(二)——与JavaScript交互

### 接入网站广告的方法 #### 自动化平台接入 对于大多数中小型网站来说,自动化广告平台是种便捷的选择。例如,可以通过 **Google AdSense** 或者国内的 **百度联盟** 来快速实现广告接入[^1]。这些服务通常只需要简单的代码嵌入操作即可完成。 - 使用 Google AdSense 的情况下,流量主需要先申请账号并通过审核[^2]。旦审核通过,可以选择两种主要的方式展示广告: - **自动广告**:由 Google 根据网页内容和布局自行决定广告的最佳位置[^2]。 - **手动广告单元**:开发者可以自由指定广告的具体显示区域,比如文章底部或者侧边栏等位置[^2]。 以下是将 Google AdSense 广告嵌入到 HTML 页面中的基本示例: ```html <!-- Google AdSense 手动广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-XXXXXXXXXXXXXX" <!-- 替换为自己的 Publisher ID --> data-ad-slot="YYYYYYYYYY"> <!-- 替换为具体的广告位ID --> </ins> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> ``` 如果希望采用更灵活的方式来控制广告行为,则可能涉及 JavaScript 脚本调用或其他高级功能配置。 #### SDK 集成方式 针对某些特定需求较高的场景(如移动应用内的 Webview),也可以考虑基于第三方 SDK 实现更加定制化的解决方案。下面是个关于 Android 应用程序中集成激励视频广告的例子[^3]: ```java public class RewardedVideoActivity extends Activity { // 测试环境下的广告位ID,在实际部署前需替换为生产版本的有效值 private static final String AD_ID = "testx9dtjwj8hp"; private RewardAd rewardAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rewarded); // 初始化奖励型广告实例 createRewardAd(); // 加载广告资源 loadRewardAd(); } /** * 构造个新的奖励广告对象 */ private void createRewardAd() { this.rewardAd = new RewardAd(this, AD_ID); } /** * 请求服务器填充广告数据 */ private void loadRewardAd() { if (this.rewardAd != null){ this.rewardAd.loadAd(new AdParam.Builder().build(), new RewardAdLoadListener(){ @Override public void onRewardedLoaded() { System.out.println("激励广告已成功加载"); } @Override public void onRewardAdFailedToLoad(int errorCode) { System.err.printf("激励广告加载失败:%d",errorCode); } }); } } } ``` 此代码片段展示了如何创建、加载以及准备展示种特殊类型的互动式广告——即所谓的“激励广告”。它适用于那些希望通过提供额外价值来吸引用户主动观看的情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值