近期在做手机浏览器的项目,做手机浏览器肯定用到的是WebView,这两天遇到了两个问题,已解决。问题如下:
问题一:比如在手机某个文件里面点击一个连接,会出现文件关联的窗口,这个窗口里面会列出很多你手机已安装的浏览器,比如手机自带的浏览器或者QQ浏览器等等,当然也有自己做的浏览器,当点击自己做的浏览器后,期望的结果当然是打开自己的浏览器,然户浏览器里面会加载此链接,然后问题就是打开的浏览器如何识别到将要打开的这个链接,至于如何让自己通过WebView做的浏览器出现在关联的窗口中,通俗的说,就是让手机识别到自己做的App属于浏览器。需要在AndroidMefiest.xml里面主Activity里面增加如下代码便可:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="about" />
<data android:scheme="javascript" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="inline" />
<data android:mimeType="text/html" />
<data android:mimeType="text/plain" />
<data android:mimeType="application/xhtml+xml" />
<data android:mimeType="application/vnd.wap.xhtml+xml" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
</intent-filter>
这样就可以被识别到属于浏览器,接下来要做的就是如何让自己的浏览器接收到将要打开的连接,很简单,这么一句:
if (intent.ACTION_VIEW.equals(action)) {
String intent_url = intent.getDataString();
}
intent.getDataString所接收到的便是将要打开的那个连接地址,然后用WebView加载便可!
问题二:
在WebView里加载SSL网页很正常,也没什么难度。但如果要加载的SSL页面的证书有问题,比如过期、信息不正确、发行机关不被信任等,WebView就会拒绝加载该网页。PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。
WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// *** NEVER DO THIS!!! ***
// super.onReceivedSslError(view, handler, error);
// let's ignore ssl error
handler.proceed();
}
}
只需像这样重载WebViewClient
的onReceivedSslError()
函数并在其中执行handler.proceed()
,即可忽略SSL证书错误,继续加载页面。
这里要注意的是,千万不要调用super.onReceivedSslError()
。这是因为WebViewClient
的onReceivedSslError()
函数中包含了一条handler.cancel()