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>


原创粉丝点击