x5webview和webview联合集成

最近要做一个主h5的android项目,恶补了一下x5,然后听到隔壁的大神说x5在部分例如中兴的手机加载速度慢,不如使用普通webview,因为项目需要,所以暂时使用这两种浏览器,但不保证后续是否会使用新的浏览器,这要求程序要有足够的扩展性,思前想后,有了大致的思路:状态模式+策略模式。


Application部分

 
 
private static final long X5_TIME = 1000L;


    private void initX5() {
        final Date date = new Date();
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {


            @Override
            public void onViewInitFinished(boolean arg0) {
                Date curDate = new Date();
                long time = curDate.getTime() - date.getTime();
                //超时则认定不适合使用,防止部分机型超时不好用问题
                if(time <= X5_TIME){
                    canUserX5 = true;
                }
                finishLoadX5 = true;
            }


            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
                finishLoadX5 = true;
            }
        };




        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(),  cb);
    }


    private boolean canUserX5 = false;
    private boolean finishLoadX5 = false;


    public boolean getFinishLoadX5(){
        return finishLoadX5;
    }
    public boolean canUseX5(){
       return canUserX5&& !AppUtil.getModel().toLowerCase().contains("huawei");
    }




//下列接口用于把命令类的内容传回给activity
public interface OnCommandListener{
        void showErrPage();//显示错误页
        void uploadFile(ValueCallback<Uri> uploadMsg,boolean isChooser);//选择文件,下同
        void uploadFiles(ValueCallback<Uri[]> uploadMsgs);
    }





然后是命令类:
public class WebCommand {
    private BaseState state = InitState.getInstance();


    public void init(IWebView webView, ProgressBar progressBar, Activity activity) {
        if (state.canInit()) {
            initWebView(webView, progressBar, activity);
        }
    }


    private String url = "";


    public interface OnCommandListener{
        void showErrPage();
        void setData(String data);
        void uploadFile(ValueCallback<Uri> uploadMsg,boolean isChooser);
        void uploadFiles(ValueCallback<Uri[]> uploadMsgs);
    }






    private OnCommandListener listener;


    public void setOnCommandListener(OnCommandListener listener){
        this.listener = listener;
    }
    private View myView = null;


    private void initWebView(final IWebView mWebView, final ProgressBar webProgress, final Activity activity) {
        mWebView.initWebClient();
        mWebView.initConfigWebSetting(activity);
        mWebView.initChromeWebClient(webProgress);
        mWebView.initDownloadListener(activity);




        if (state.getState() != BaseState.ERR_STATE)
            state = NotLoadState.getInstance();
        mWebView.setOnWebStateChangeListener(new OnWebStateChangeListener() {
            @Override
            public void onPageFinished(IWebView view, String url) {
                if(url.equals("about:blank")){
                    state = ErrState.getInstance();
                    if(state.canRefresh()){
                        mWebView.loadMyUrl(url);
                    }else if(listener!=null){
                        listener.showErrPage();
                    }
                    return;
                }
                WebCommand.this.url = url;
                if (state.getState() != BaseState.ERR_STATE) {
                    state = LoadedState.getInstance();
                }


            }


            @Override
            public void onReceivedError(IWebView webView, int i, String s, String s1) {
                state = ErrState.getInstance();
                if(state.canRefresh()){
                    mWebView.loadMyUrl(url);
                }else if(listener!=null){
                    listener.showErrPage();
                }
            }


            @Override
            public void uploadFile(ValueCallback<Uri> uploadMsg, boolean isChooser) {
                listener.uploadFile(uploadMsg,isChooser);
            }


            @Override
            public void uploadFiles(ValueCallback<Uri[]> uploadMsgs) {
                listener.uploadFiles(uploadMsgs);
            }


            @Override
            public void onProgressChanged(IWebView var1, int progress) {
                webProgress.setProgress(progress);
                if (progress == 100) {
                    webProgress.setVisibility(View.GONE);
                } else if (progress > 0) {
                    if (state.getState() != BaseState.ERR_STATE)
                        state = LoadingState.getInstance();
                    webProgress.setVisibility(View.VISIBLE);
                }
            }
        });


    }




    public void loadUrl(IWebView mWebView, String url, Activity activity) {
        if (state.canLoad()) {
            this.url = url;
            mWebView.loadMyUrl(url);


        }
    }


    public void refresh(IWebView webView){
        if(state.canRefresh() && url.length()>0){
            webView.loadMyUrl(url);
        }
    }


    public boolean back(IWebView webView){
        return webView.back();
    }


}


webview适配接口:
public interface IWebView {
    void initWebClient();
    void initChromeWebClient(ProgressBar progressBar);
    void initDownloadListener(Activity activity);
    void initConfigWebSetting(Activity activity);
    void loadMyUrl(String url);
    boolean back();


    void setOnWebStateChangeListener(OnWebStateChan geListener stateChangeListener);
}

X5WebView:
package com.yonxin.sqt.sqtandroid.webs.view;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.tencent.smtt.export.external.interfaces.JsResult;
import com.tencent.smtt.sdk.CookieSyncManager;
import com.tencent.smtt.sdk.DownloadListener;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import com.tencent.smtt.utils.TbsLog;
import com.yonxin.sqt.sqtandroid.webs.IWebView;
import com.yonxin.sqt.sqtandroid.webs.OnWebStateChangeListener;

import static com.bumptech.glide.gifdecoder.GifHeaderParser.TAG;

public class X5WebView extends WebView implements IWebView {
	TextView title;
	private WebViewClient client = new WebViewClient() {
		/**
		 * 防止加载网页时调起系统浏览器
		 */
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}
	};

	@SuppressLint("SetJavaScriptEnabled")
	public X5WebView(Context arg0, AttributeSet arg1) {
		super(arg0, arg1);
		this.setWebViewClient(client);
		// this.setWebChromeClient(chromeClient);
		// WebStorage webStorage = WebStorage.getInstance();
		this.getView().setClickable(true);

	}


	public X5WebView(Context arg0) {
		super(arg0);
		setBackgroundColor(85621);
	}



	private OnWebStateChangeListener stateChangeListener;

	@Override
	public void setOnWebStateChangeListener(OnWebStateChangeListener 

stateChangeListener){
		this.stateChangeListener = stateChangeListener;
	}


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

			@Override
			public void onPageFinished(WebView view, String url) {
				super.onPageFinished(view, url);
				if(stateChangeListener!=null) {
					stateChangeListener.onPageFinished

(X5WebView.this,url);
				}
			}

			@Override
			public void onReceivedError(WebView webView, int i, String s, 

String s1) {
				super.onReceivedError(webView, i, s, s1);
				if(stateChangeListener!=null) {
					stateChangeListener.onReceivedError

(X5WebView.this,i, s, s1);
				}
			}
		});
	}


	@Override
	public void initChromeWebClient(ProgressBar progressBar) {
		setWebChromeClient(new WebChromeClient() {

			// For Android 3.0+
			public void openFileChooser(ValueCallback<Uri> uploadMsg, String 

acceptType) {
				if(stateChangeListener!=null) {
					stateChangeListener.uploadFile(uploadMsg,false);
				}
			}

			// For Android < 3.0
			public void openFileChooser(ValueCallback<Uri> uploadMsg) {
				if(stateChangeListener!=null) {
					stateChangeListener.uploadFile(uploadMsg,true);
				}
			}

			// For Android  > 4.1.1
			public void openFileChooser(ValueCallback<Uri> uploadMsg, String 

acceptType, String capture) {
				if(stateChangeListener!=null) {
					stateChangeListener.uploadFile(uploadMsg,true);
				}
			}

			// For Android  >= 5.0
			public boolean onShowFileChooser(com.tencent.smtt.sdk.WebView 

webView,
											 

ValueCallback<Uri[]> filePathCallback,
											 

WebChromeClient.FileChooserParams fileChooserParams) {
				if(stateChangeListener!=null) {
					stateChangeListener.uploadFiles(filePathCallback);
				}
				return true;
			}
			@Override
			public boolean onJsConfirm(WebView arg0, String arg1, String arg2,
									   JsResult arg3) {
				return super.onJsConfirm(arg0, arg1, arg2, arg3);
			}

			@Override
			public void onProgressChanged(WebView var1, int progress) {
				if(stateChangeListener!=null) {
					stateChangeListener.onProgressChanged

(X5WebView.this,progress);
				}
			}
		});
	}

	@Override
	public void initDownloadListener(final Activity activity) {
		setDownloadListener(new DownloadListener() {

			@Override
			public void onDownloadStart(String arg0, String arg1, String arg2,
										String 

arg3, long arg4) {
				TbsLog.d(TAG, "url: " + arg0);
				new AlertDialog.Builder(activity)
						.setTitle("allow to download?")
						.setPositiveButton("yes",
								new 

DialogInterface.OnClickListener() {
									@Override
									public void 

onClick(DialogInterface dialog,
												

		int which) {
										

Toast.makeText(
												

activity,
												

"fake message: i'll download...",
												

Toast.LENGTH_LONG).show();
									}
								})
						.setNegativeButton("no",
								new 

DialogInterface.OnClickListener() {

									@Override
									public void 

onClick(DialogInterface dialog,
												

		int which) {
										// TODO 

Auto-generated method stub
										

Toast.makeText(
												

activity,
												

"fake message: refuse download...",
												

Toast.LENGTH_SHORT).show();
									}
								})
						.setOnCancelListener(
								new 

DialogInterface.OnCancelListener() {

									@Override
									public void 

onCancel(DialogInterface dialog) {
										// TODO 

Auto-generated method stub
										

Toast.makeText(
												

activity,
												

"fake message: refuse download...",
												

Toast.LENGTH_SHORT).show();
									}
								}).show();
			}
		});
	}

	@Override
	public void initConfigWebSetting(Activity activity) {
		WebSettings webSetting = getSettings();
		webSetting.setAllowFileAccess(true);
		webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
		webSetting.setSupportZoom(true);
		webSetting.setBuiltInZoomControls(true);
		webSetting.setUseWideViewPort(true);
		webSetting.setSupportMultipleWindows(false);
		// webSetting.setLoadWithOverviewMode(true);
		webSetting.setAppCacheEnabled(true);
		// webSetting.setDatabaseEnabled(true);
		webSetting.setDomStorageEnabled(true);
		webSetting.setJavaScriptEnabled(true);
		webSetting.setGeolocationEnabled(true);

        if(Build.VERSION.SDK_INT>Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){
            webSetting.setAllowFileAccessFromFileURLs(true);
        }
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        String ua = webSetting.getUserAgentString();
        webSetting.setUserAgentString(ua + " ");

		webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
		webSetting.setAppCachePath(activity.getDir("appcache", 0).getPath());
		webSetting.setDatabasePath(activity.getDir("databases", 0).getPath());
		webSetting.setGeolocationDatabasePath(activity.getDir("geolocation", 0)
				.getPath());
		// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
		webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
		// webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
		// webSetting.setPreFectch(true);

        CookieSyncManager.createInstance(getContext());
        CookieSyncManager.getInstance().sync();

	}

	@Override
	public void loadMyUrl(String url) {
		loadUrl(url);
	}


	@Override
	public boolean back() {
		boolean canBack = canGoBack();
		if(canBack){
			goBack();
		}
		return canBack;
	}
}







NormalWebView
package com.yonxin.sqt.sqtandroid.webs.view;


import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Build;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.webkit.CookieManager;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;


import com.tencent.smtt.utils.TbsLog;
import com.yonxin.sqt.sqtandroid.webs.IWebView;
import com.yonxin.sqt.sqtandroid.webs.OnWebStateChangeListener;


import static com.bumptech.glide.gifdecoder.GifHeaderParser.TAG;


/**
 * Created by Administrator on 2017/7/26.
 */


public class NormalWebView extends WebView implements IWebView {
    public NormalWebView(Context context) {
        super(context);
    }


    public NormalWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    public NormalWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public NormalWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }


    public NormalWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(context, attrs, defStyleAttr, privateBrowsing);
    }


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


            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if(stateChangeListener!=null) {
                    stateChangeListener.onPageFinished(NormalWebView.this,url);
                }
            }


            @Override
            public void onReceivedError(WebView webView, int i, String s, String s1) {
                super.onReceivedError(webView, i, s, s1);
                if(stateChangeListener!=null) {
                    stateChangeListener.onReceivedError(NormalWebView.this,i, s, s1);
                }
            }


            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return super.shouldOverrideKeyEvent(view, event);
            }




        });
    }


    @Override
    public void initChromeWebClient(ProgressBar progressBar) {
        setWebChromeClient(new WebChromeClient() {


            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                if(stateChangeListener!=null) {
                    stateChangeListener.uploadFile(uploadMsg,false);
                }
            }


            // For Android < 3.0
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                if(stateChangeListener!=null) {
                    stateChangeListener.uploadFile(uploadMsg,true);
                }
            }


            // For Android  > 4.1.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                if(stateChangeListener!=null) {
                    stateChangeListener.uploadFile(uploadMsg,true);
                }
            }


            // For Android  >= 5.0
            public boolean onShowFileChooser(WebView webView,
                                             ValueCallback<Uri[]> filePathCallback,
                                             WebChromeClient.FileChooserParams fileChooserParams) {
                if(stateChangeListener!=null) {
                    stateChangeListener.uploadFiles(filePathCallback);
                }
                return true;
            }


            @Override
            public void onProgressChanged(WebView webView, int i) {
                if(stateChangeListener!=null) {
                    stateChangeListener.onProgressChanged(NormalWebView.this,i);
                }
            }






        });


        }


    @Override
    public void initDownloadListener(final Activity activity) {
        setDownloadListener(new DownloadListener() {


            @Override
            public void onDownloadStart(String arg0, String arg1, String arg2,
                                        String arg3, long arg4) {
                TbsLog.d(TAG, "url: " + arg0);
                new AlertDialog.Builder(activity)
                        .setTitle("allow to download?")
                        .setPositiveButton("yes",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        Toast.makeText(
                                                activity,
                                                "fake message: i'll download...",
                                                Toast.LENGTH_LONG).show();
                                    }
                                })
                        .setNegativeButton("no",
                                new DialogInterface.OnClickListener() {


                                    @Override
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        // TODO Auto-generated method stub
                                        Toast.makeText(
                                                activity,
                                                "fake message: refuse download...",
                                                Toast.LENGTH_SHORT).show();
                                    }
                                })
                        .setOnCancelListener(
                                new DialogInterface.OnCancelListener() {


                                    @Override
                                    public void onCancel(DialogInterface dialog) {
                                        // TODO Auto-generated method stub
                                        Toast.makeText(
                                                activity,
                                                "fake message: refuse download...",
                                                Toast.LENGTH_SHORT).show();
                                    }
                                }).show();
            }
        });
    }


    @Override
    public void initConfigWebSetting(Activity activity) {
        WebSettings webSetting = getSettings();
        webSetting.setAllowFileAccess(true);
        webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        webSetting.setSupportZoom(true);
        webSetting.setBuiltInZoomControls(true);
        webSetting.setUseWideViewPort(true);
        webSetting.setSupportMultipleWindows(false);
        // webSetting.setLoadWithOverviewMode(true);
        webSetting.setAppCacheEnabled(true);
        // webSetting.setDatabaseEnabled(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setJavaScriptEnabled(true);
        webSetting.setGeolocationEnabled(true);


        if(Build.VERSION.SDK_INT>Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){
            webSetting.setAllowFileAccessFromFileURLs(true);
        }
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        String ua = webSetting.getUserAgentString();
        webSetting.setUserAgentString(ua + " ");


        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
        webSetting.setAppCachePath(activity.getDir("appcache", 0).getPath());
        webSetting.setDatabasePath(activity.getDir("databases", 0).getPath());
        webSetting.setGeolocationDatabasePath(activity.getDir("geolocation", 0)
                .getPath());
        // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
        // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
        // webSetting.setPreFectch(true);


        CookieManager cookieManager = CookieManager.getInstance();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.setAcceptThirdPartyCookies(this, true);
        } else {
            cookieManager.setAcceptCookie(true);
        }
        CookieManager.setAcceptFileSchemeCookies(true);




    }


    @Override
    public void loadMyUrl(String url) {
        loadUrl(url);
    }


    @Override
    public boolean back() {
        boolean canBack = canGoBack();
        if(canBack){
            goBack();
        }
        return canBack;
    }


    private OnWebStateChangeListener stateChangeListener;


    @Override
    public void setOnWebStateChangeListener(OnWebStateChangeListener stateChangeListener){
        this.stateChangeListener = stateChangeListener;
    }
}






activity初始化:
private void initViews() {
        final App app = (App) getApplicationContext();
        final ProgressBar webProgress = (ProgressBar) findViewById(R.id.web_progress);


        //如果x5加载完毕,则直接初始化浏览器,否则等待一段时间,之所以这样做不直接用接口之类返回数据,是防止x5耗时太久,导致程序体验差
        if(app.getFinishLoadX5()){
            loadWebView();


        }else{
            webProgress.postDelayed(new Runnable() {
                @Override
                public void run() {
                    loadWebView();
                }
            },1000);
        }


        command.setOnCommandListener(new WebCommand.OnCommandListener() {
            @Override
            public void showErrPage() {


            }


            @Override
            public void setData(String data) {


            }


            @Override
            public void uploadFile(android.webkit.ValueCallback<Uri> uploadMsg, boolean 


isChooser) {
                XXActivity.this.uploadMsg = uploadMsg;
                chooseFile(isChooser);
            }


            @Override
            public void uploadFiles(android.webkit.ValueCallback<Uri[]> uploadMsgs) {
                XXActivity.this.uploadMsgs = uploadMsgs;
                chooseFile(true);
            }
        });
    }


    private void loadWebView() {
        final App app = (App) getApplicationContext();
        final ProgressBar webProgress = (ProgressBar) findViewById(R.id.web_progress);
        final Toolbar ll = (Toolbar) findViewById(R.id.main_layout);


        IWebView webView = null;


        if(app.canUseX5()){
            webView = new X5WebView(getApplicationContext());
            ((LinearLayout)ll.getChildAt(0)).addView((X5WebView)webView);
        }else{
            webView = new NormalWebView(getApplicationContext());
            ((LinearLayout)ll.getChildAt(0)).addView((NormalWebView)webView);
        }


        command.init(webView,webProgress,XXActivity.this);
        command.loadUrl(webView,"url地址",XXActivity.this);


    }


    private final WebCommand command = new WebCommand();


    private void chooseFile(boolean isChooser) {
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType(isChooser?"image/*":"*/*");
        startActivityForResult(
                Intent.createChooser(i, isChooser?"File Chooser":"File Browser"),
                XXActivity.FILECHOOSER_RESULTCODE);
    }


    private static  final int FILECHOOSER_RESULTCODE = 1;


    private android.webkit.ValueCallback<Uri> uploadMsg;
    private android.webkit.ValueCallback<Uri[]> uploadMsgs;


//返回:
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case FILECHOOSER_RESULTCODE:
                    if (null == uploadMsg && null == uploadMsgs) return;
                    if (null != uploadMsg) {
                        Uri result = data == null || resultCode != RESULT_OK ? null
                                : data.getData();
                        uploadMsg.onReceiveValue(result);
                        uploadMsg = null;
                    }
                    if (null != uploadMsgs) {
                        Uri result = data == null || resultCode != RESULT_OK ? null
                                : data.getData();
                        uploadMsgs.onReceiveValue(new Uri[]{result});
                        uploadMsgs = null;
                    }
                    break;
                default:
                    break;
            }
        }else if (resultCode == RESULT_CANCELED) {
            chooseFileFailure();


        }
    }


    private void chooseFileFailure(){
        if (null == uploadMsg && null == uploadMsgs) return;
        if (null != uploadMsg) {
            uploadMsg.onReceiveValue(null);
            uploadMsg = null;
        }
        if(null != uploadMsgs){
            uploadMsgs.onReceiveValue(new Uri[]{});
            uploadMsgs = null;
        }
    }




大概这么多,这里提示几个坑点:
1.上述的两个WebView看着大致相同,实际上两者导入的包不同,倒错了运行时可能game over,文件选择那里为了方便使用自动提示,结果它跳出来的是com.tencent那个WebView,泪奔。。。我调了3个小时。
2.腾讯官方的x5例子很奇怪,第一次选择文件成功后面失败,找了好久才发现它只判断了RESULT_CANCELED的uploadMsg,没判断uploadMsgs,结果我的是5.0的测试机,取消后怎么都弹不出来,
于是加了uploadMsgs的部分,就可以了,额,差点因为这个奇葩的理由放弃x5。
3.如果有需要添加使用其他大神的webview,可以继续叠加哦,而且只要增加判断,不怎么用改这些代码,达到我要的可扩展性,
happy ending!
4.有个坑没填:没释放webview,这个简单,读者自己解决了哈。


用的是腾讯那个网页,这里也贴一下好了:
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,maximun-scale=1,mininum-scsle=1,user-scale=1">
    <title>file chooser</title>
    <style>
        .filechooser{
            width:95%;
            height: 50px;
            -webkit-background-clip: border-box;


        }
    </style>
    <script >
        var display=function (){
            var path=document.getElementById("file_chooser").textContent;
            document.getElementById("filechooser_display").innerHTML("<b>"+path+"</b>");
        }
    </script>
</head>
<body>
    <ul class="listview">
        <li class="listviewItem">
            <fieldset class="itemset">
                <input class="filechooser" id="file_chooser" type="file" placeholder="file path" οnchange="display()" οninput="display()"><br>
                <p id="filechooser_display"></p>
                <div class="line_black"></div>


            </fieldset>
        </li>


    </ul>


</body>


</html>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值