Android
来源:互联网 发布:营销视频制作软件 编辑:程序博客网 时间:2024/06/14 09:17
转载自:http://www.cnblogs.com/ruichenblogs/p/5893589.html
正文:webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好。但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带的浏览器。
webview.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); LoadingDialog.closeDialog(); } });
在此方法中可以监听浏览器开始加载网页和加载网页结束。
今天着重讲的并不是上边的两个方法而是下面的这位
putinmoney_webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { } });
shouldOverrideUrlLoading并不是每次都在onPageStarted之前开始调用的,只有在调用webview.loadURL的时候才会调用。
webview.loadUrl("https://qr.alipay.com/bax05351pgjhc4yegd2y2084");
但发起请求的时候后,webview的连续动作是先后请求两个url
1.https://mobilecodec.alipay.com/client_download.htm?qrcode=bax05351pgjhc4yegd2y2084
2.https://ds.alipay.com/from=mobilecodec&scheme=alipayqr%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D10000007%26clientVersion%3D3.7.0.0718%26qrcode%3Dhttps%253A%252F%252Fqr.alipay.com%252Fbax05351pgjhc4yegd2y2084%253F_s%253Dweb-other
之后返回一个意图,也是用这个意图来打开支付宝app
intent://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2Fbax05351pgjhc4yegd2y2084%3F_s%3Dwebother&_t=1474448799004#Intent;scheme=alipayqr;package=com.eg.android.AlipayGphone;end
webview.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.e(TAG, "访问的url地址:" + url); if (parseScheme(url)) { try { Uri uri = Uri.parse(url); Intent intent; intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); intent.addCategory("android.intent.category.BROWSABLE"); intent.setComponent(null); // intent.setSelector(null); startActivity(intent); } catch (Exception e) { } } else { view.loadUrl(url); } return true; } });
关于"android.intent.category.BROWSABLE"参考:
http://blog.csdn.net/gf771115/article/details/7827833
此外要对webview设置下:
WebSettings webSettings = webview.getSettings();webSettings.setJavaScriptEnabled(true);// 设置可以访问文件webSettings.setAllowFileAccess(true);// 设置支持缩放webSettings.setBuiltInZoomControls(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);// webSettings.setDatabaseEnabled(true);// 使用localStorage则必须打开webSettings.setDomStorageEnabled(true);webSettings.setGeolocationEnabled(true);
实例下载地址:https://github.com/reachchen/loadurltoali.git
在项目中发现的问题在此修正:
发现一些手机(例如一些升级了7.0的手机)在请求后并没有返回intent,所以就会出现调不起支付宝的情况。但是用浏览器直接打开是可以的
兼容的思路如下:
新建一个线程,在用户发出请求后,如果10秒的时间没有收到调起的intent,就用浏览器直接调起。
代码如下:
public boolean parseScheme(String url) { if (url.contains("platformapi/startapp")){ myHandler.removeCallbacks(runable); return true; } else if(url.contains("web-other")){ myHandler.postDelayed(runable, 10000); return false; }else { return false; } }
新建的线程
myHandler = new Handler(); runable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub LoadingDialog.closeDialog(); webview_another.loadUrl(myaliWebUrl.get("code_url")); } }; }
完整代码:
java:
package com.reachchen.loadurltoalipay;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;public class MainActivity extends Activity {private Button btn_startaliapp;private WebView webview;private String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_startaliapp = (Button) findViewById(R.id.btn_startaliapp);//应用过程中将其隐藏掉效果更佳webview = (WebView) findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();webSettings.setJavaScriptEnabled(true);// 设置可以访问文件webSettings.setAllowFileAccess(true);// 设置支持缩放webSettings.setBuiltInZoomControls(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);// webSettings.setDatabaseEnabled(true);// 使用localStorage则必须打开webSettings.setDomStorageEnabled(true);webSettings.setGeolocationEnabled(true);webview.setWebViewClient(new WebViewClient(){@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {// TODO Auto-generated method stubsuper.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {// TODO Auto-generated method stubsuper.onPageFinished(view, url);}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.e(TAG, "访问的url地址:" + url);if (parseScheme(url)) {try {Uri uri = Uri.parse(url);Intent intent;intent = Intent.parseUri(url,Intent.URI_INTENT_SCHEME);intent.addCategory("android.intent.category.BROWSABLE");intent.setComponent(null);// intent.setSelector(null);startActivity(intent);} catch (Exception e) {}} else {view.loadUrl(url);}return true;}});btn_startaliapp.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubwebview.loadUrl("https://qr.alipay.com/bax05351pgjhc4yegd2y2084");}});}public boolean parseScheme(String url) {if (url.contains("platformapi/startapp")) {return true;} else {return false;}}}
xml布局:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btn_startaliapp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调起支付宝"/> <WebView android:id="@+id/webview" android:layout_below="@+id/btn_startaliapp" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- 解决PHP报错 SSL routines:ssl3_get_server_certificate:certificate verify failed
- 关于PHP单链表的基本操作
- Java自定义注解(annotation)基本使用
- 从零开始使用SSM框架(一)
- Gradle篇二——gradle原理
- Android
- Unity 在Editor中使用剪切板
- Mono.Cecil使用示例之使指定程序集成为UnityEditor.dll的友元程序集
- MySql的心得
- HDU-4109 Instrction Arrangement(差分约束系统+增加源点技巧)
- JS学习的几点思考(一)
- Linux驱动编写经验
- Linux之网络基础
- 9. 监督学习实例——运动状态预测