找回密码
 注册
搜索
查看: 2292|回复: 1

Android WebView常见问题的解决方案总结----例如Web page not available

[复制链接]
发表于 2014-12-9 19:02:09 | 显示全部楼层 |阅读模式
       之前android虚拟机一直都可以直接联网,今天写了一个WebView之后,突然报出了Web page not available的错误,但是查看虚拟机自带的浏览器,是可以上网的,所以检查还是代码的问题,这里给大家列出一些android开发中使用WebView时需要注意的一些小细节,大家共享。1、首先是出现Web page not available的解决方案:检查AndroidManifest.xml是否添加了权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET"添加方法:在与<application>同级的地方添加<uses-permission android:name="android.permission.INTERNET"/>
2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);

3、设置WebView基本信息:
       如果访问的页面中有Javascript,则webview必须设置支持Javascript。
       webview.getSettings().setJavaScriptEnabled(true);  
       触摸焦点起作用
       requestFocus();
       取消滚动条
       this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);

4、设置WevView要显示的网页:
       互联网用:webView.loadUrl("http://www.google.com");
       本地文件用:webView.loadUrl("file:///android_asset/XX.html");  本地文件存放在:assets文件中

5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
       给WebView添加一个事件监听对象(WebViewClient)      
  
       并重写其中的一些方法
           shouldOverrideUrlLoading:对网页中超链接按钮的响应。
                当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
           onLoadResource   
           onPageStart  
           onPageFinish  
           onReceiveError
           onReceivedHttpAuthRequest
         
6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
    覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
    public boolean onKeyDown(int keyCoder,KeyEvent event){
            if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                   webview.goBack();   //goBack()表示返回webView的上一页面
                   return true;
                  }
           return false;
       }

文字的结尾,给大家共享一下常用的一些使用权限:添加WiFi以及访问网络的权限:
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>
     <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
     <uses-permission android:name="android.permission.WAKE_LOCK" ></uses-permission>

操作外部存储设备文件:
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

录音时需要的权限:
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

录制视频时需要的权限:
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

发送短信:
    <uses-permission android:name="android.permission.SEND_SMS" ></uses-permission>

收短信:
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

收彩信:
    <uses-permission android:name="android.permission.READ_SMS" />

GPS:
    <!-- 权限 :  连接网络    -->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <!-- 权限 :  GPS定位     -->
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

    <!-- 权限 : AGPS定位      -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

 楼主| 发表于 2014-12-9 19:03:37 | 显示全部楼层

Android-----WebView使用

大部分内容为网上整理其它高人的帖子,现只作整理,用于查看:
在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。

什么是webkit

WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。

传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。

这里我们初步体验一下在android是使用webview浏览网页,在SDK的Dev Guide中有一个WebView的简单例子 。

在开发过程中应该注意几点:
    1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
    2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
        webview.getSettings().setJavaScriptEnabled(true);  
    3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。



  • mWebView.setWebViewClient(new WebViewClient(){      
  •                     public boolean shouldOverrideUrlLoading(WebView view, String url) {      
  •                         view.loadUrl(url);      
  •                         return true;      
  •                     }      
  •         });   



4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。



  • public boolean onKeyDown(int keyCode, KeyEvent event) {      
  •         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {      
  •             mWebView.goBack();      
  •                    return true;      
  •         }      
  •         return super.onKeyDown(keyCode, event);      
  •     }     



下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。
  看一个实例:


view plaincopy to clipboardprint?

  • public class WebViewDemo extends Activity {        
  •     private WebView mWebView;      
  •     private Handler mHandler = new Handler();      
  •       
  •     public void onCreate(Bundle icicle) {      
  •         super.onCreate(icicle);      
  •         setContentView(R.layout.webviewdemo);      
  •         mWebView = (WebView) findViewById(R.id.webview);      
  •         WebSettings webSettings = mWebView.getSettings();      
  •         webSettings.setJavaScriptEnabled(true);      
  •         mWebView.addJavascriptInterface(new Object() {      
  •             public void clickOnAndroid() {      
  •                 mHandler.post(new Runnable() {      
  •                     public void run() {      
  •                         mWebView.loadUrl("javascript:wave()");      
  •                     }      
  •                 });      
  •             }      
  •         }, "demo");      
  •         mWebView.loadUrl("file:///android_asset/demo.html");      
  •     }      
  • }   



我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。



  • <html>      
  •         <mce:script language="javascript"><!--     
  •       
  •                 function wave() {      
  •                     document.getElementById("droid").src="android_waving.png";      
  •                 }      
  •             
  • // --></mce:script>      
  •         <body>      
  •             <a onClick="window.demo.clickOnAndroid()">      
  •                                 <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>      
  •                                 Click me!      
  •             </a>      
  •         </body>      
  • </html>      



这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点:

1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-5-5 00:13 , Processed in 0.015832 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表