Webview工具類

在項目開發過程當中,免不了要進行混合開發,也就是常見的web混合開發,記錄一下項目中經常使用的部分代碼。java

  1. webSetting常見屬性設置
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        //WebView屬性設置!!!
        WebSettings settings = mWebView.getSettings();
        //設置加載js
        settings.setJavaScriptEnabled(true);
        settings.setAllowFileAccess(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        settings.setDomStorageEnabled(true);
        settings.setUseWideViewPort(true);
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        settings.setLoadWithOverviewMode(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setDatabaseEnabled(true);

        //webview在安卓5.0以前默認容許其加載混合網絡協議內容
        // 在安卓5.0以後,默認不容許加載http與https混合內容,須要設置webview容許其加載混合網絡協議內容
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
複製代碼
  1. webclient
mWebView.setWebChromeClient(new MyWebChromeClient());

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
               
                Log.i("網頁攔截中加載的url:", url);
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @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);


            }
        });
        
        
class MyWebChromeClient extends WebChromeClient {

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (newProgress == 100) {
                mProgressBar.setVisibility(View.GONE);
            } else {
                mProgressBar.setVisibility(View.VISIBLE);
                mProgressBar.setProgress(newProgress);
            }

        }

        @Override
        public void onReceivedTitle(WebView view, String webtitle) {
            super.onReceivedTitle(view, webtitle);
            LogUtils.logi("網頁標題:" + webtitle);
            if (!TextUtils.isEmpty(webtitle)) {
                mTitle.setTitle(false, null, webtitle);
            } else {
                mTitle.setTitle(false, null, "提現");
            }


        }

        //Android 5.0 及以上 必須重寫此方法
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            boolean fromCamera = fileChooserParams.isCaptureEnabled();
            String[] acceptTypes = fileChooserParams.getAcceptTypes();
            if (acceptTypes != null && acceptTypes.length > 0) {

                boolean isImage = false;
                for (String acceptType : acceptTypes) {
                    if (acceptType.contains("image")) {
                        isImage = true;
                        break;
                    }
                }
                if (isImage) {//處理圖片
                    if (fromCamera) {//只處理拍照
                        if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
                            WebViewActivity.this.filePathCallback = filePathCallback;//暫存,用於拍完照片後回調H5
                            return true;//返回true表示APP處理文件選擇
                        }
                    }
                }


                boolean isVideo = false;
                for (String acceptType : acceptTypes) {
                    if (acceptType.contains("video")) {
                        isVideo = true;
                        break;
                    }
                }
                if (isVideo) {//處理視頻
                    if (fromCamera) {//只處理拍攝視頻
                        if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
                            WebViewActivity.this.filePathCallback = filePathCallback;//暫存,用於拍攝完視頻後回調H5
                            return true;//返回true表示APP處理文件選擇
                        }
                    }
                }
            }
            return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
        }

        //Android 5.0 如下 必須重寫此方法
        public void openFileChooser(final ValueCallback<Uri> uploadFile, String acceptType, String capture) {
            LogUtils.loge("點擊文件的類型是:" + acceptType);
            boolean fromCamera = !TextUtils.isEmpty(capture);
            if (acceptType != null && acceptType.contains("video")) {//處理視頻
                if (fromCamera) {//只處理拍攝視頻
                    if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
                        WebViewActivity.this.uploadFile = uploadFile;//暫存,用於拍攝完視頻後回調H5
                        return;
                    }
                }
            }
            if (acceptType != null && acceptType.contains("image")) {//處理圖片
                if (fromCamera) {//只處理拍照
                    if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
                        WebViewActivity.this.uploadFile = uploadFile;//暫存,用於拍完照片後回調H5
                    }
                }
            }
        }

    }

複製代碼
  1. js注入
    爲了偷個懶,方便方便webview的js操做,特地用了以下的第三方,目前在使用過程當中還未發現大問題,by the way,ios也是通用的。
//webview jsbridge
    implementation 'com.github.wendux:WebViewJavascriptBridge:master-SNAPSHOT'
    compile('com.github.gzu-liyujiang.AndroidPicker:WheelPicker:1.5.6') {
        exclude group: 'com.android.support'
    }
複製代碼
mWebView.registerHandler("testObjcCallback", (WVJBWebView.WVJBHandler) (data, callback) -> {
            callback.onResult(data);
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());
            //此到處理data回調的結果
        });
        
複製代碼
  1. 文件下載
/** * 下載文件監聽 跳轉瀏覽器下載 * * @param mWebView */
    public static void addDownLoadListener(Activity activity, WVJBWebView mWebView) {
        mWebView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
            if (!TextUtils.isEmpty(url)) {
                downloadByBrowser(activity, url);
            }
        });
    }
    
//跳轉到外部瀏覽器進行下載
    public static void downloadByBrowser(Activity activity, String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.setData(Uri.parse(url));
        activity.startActivity(intent);
    }

複製代碼
  1. 加載的url歷史堆棧信息(跨域的url)
    這段代碼主要是處理跨域後後到以前網頁的歷史瀏覽信息
/** * 加載的url歷史堆棧信息 * * @param loadHistoryUrls:url數組信息 * @param mWebView * @param activity * @param isMain:是否爲首頁的tab頁面 */
    public static void receiverGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, Activity activity, boolean isMain, ImageView imageView) {
        //過濾是否爲重定向後的連接
        LogUtils.loge("網頁攔截中加載的url歷史堆棧信息:" + loadHistoryUrls.toString());
        if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
            if (loadHistoryUrls.size() > 2) {
                //移除加載棧中的最後兩個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            if (loadHistoryUrls.size() > 1) {
                //移除加載棧中的最後一個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            LogUtils.loge("攔截中後退的url歷史記錄" + loadHistoryUrls.toString());
            //加載重定向以前的頁
            if (isMain) {
                if (loadHistoryUrls.size() == 1) {
                    imageView.setVisibility(View.INVISIBLE);
                }
            }
            mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
        } else {
            activity.finish();

        }
    }
    
  public static void onPressGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, ImageView imageView, Activity activity) {

        //過濾是否爲重定向後的連接
        LogUtils.loge("網頁攔截中加載的url歷史堆棧信息:" + loadHistoryUrls.toString());
        if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
            if (loadHistoryUrls.size() > 2) {
                //移除加載棧中的最後兩個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            if (loadHistoryUrls.size() > 1) {
                //移除加載棧中的最後一個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            LogUtils.loge("攔截中後退的url歷史記錄" + loadHistoryUrls.toString());
            //加載重定向以前的頁
            if (loadHistoryUrls.size() == 1) {
                imageView.setVisibility(View.INVISIBLE);
            }
            mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
        } else {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                ToastUtil.showToast("再按一次退出程序");
                exitTime = System.currentTimeMillis();
            } else {
                activity.finish();
            }

        }
    }
複製代碼

多的就不說了,附帶源碼部分 WebUtils.javaandroid

public class WebUtils {
    public static UMShareListener umShareListener = new UMShareListener() {
        @Override
        public void onStart(SHARE_MEDIA share_media) {

        }

        @Override
        public void onResult(SHARE_MEDIA platform) {
            ToastUtil.showToast("分享成功");
        }

        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            ToastUtil.showToast("分享失敗");
        }

        @Override
        public void onCancel(SHARE_MEDIA platform) {
        }
    };
    private static long exitTime = 0;

    public static void loadWebSetting(WVJBWebView mWebView) {

        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        //WebView屬性設置!!!
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setAllowFileAccess(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        settings.setDomStorageEnabled(true);
        settings.setUseWideViewPort(true);
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        settings.setLoadWithOverviewMode(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setDatabaseEnabled(true);

        //webview在安卓5.0以前默認容許其加載混合網絡協議內容
        // 在安卓5.0以後,默認不容許加載http與https混合內容,須要設置webview容許其加載混合網絡協議內容
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
    }

    /** * webview中註冊的js方法 * * @param activity * @param mWebView */
    public static void loadWebJsMethod(Activity activity, WVJBWebView mWebView) {


        //分享功能
        mWebView.registerHandler("testObjcCallback", (WVJBWebView.WVJBHandler) (data, callback) -> {
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());


            callback.onResult(data);

            Gson gson = new Gson();
            if (data != null) {
                ShareForWebBean bean1 = gson.fromJson(data.toString(), ShareForWebBean.class);
                initShare(activity, bean1);
            }

        });


        //返回首頁
        mWebView.registerHandler("backHome", (WVJBWebView.WVJBHandler) (data, callback) -> {
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());


            callback.onResult(data);

            ARouter.getInstance().build(RouterUtil.INDEXMAIN).withInt("pageFlag", 1).navigation();
            activity.finish();
        });
        //提現頁面
        mWebView.registerHandler("profit", (WVJBWebView.WVJBHandler) (data, callback) -> {
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());
            callback.onResult(data);
            ARouter.getInstance().build(RouterUtil.WITHDRAW).withDouble("profit", Double.parseDouble(data.toString())).navigation();

        });

        //關閉webview頁面
        mWebView.registerHandler("finish", (WVJBWebView.WVJBHandler) (data, callback) -> {
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());
            callback.onResult(data);
            activity.finish();
        });
        // 查看還款記錄
        mWebView.registerHandler("repayrecord", (WVJBWebView.WVJBHandler) (data, callback) -> {
            Log.d("wvjsblog", "Java Echo called with: " + data.toString());
            callback.onResult(data);
            ARouter.getInstance().build(RouterUtil.REPAYRECORD).navigation();


        });
    }

    public static void initShare(Activity activity, ShareForWebBean bean) {
        //wechat=微信,coterie=朋友圈,qq=QQ
        SHARE_MEDIA share_media = SHARE_MEDIA.QQ;
        if (!TextUtils.isEmpty(bean.getCode())) {
            switch (bean.getCode()) {
                case "wechat":
                    share_media = SHARE_MEDIA.WEIXIN;
                    break;
                case "coterie":
                    share_media = SHARE_MEDIA.WEIXIN_CIRCLE;
                    break;
                case "qq":
                    share_media = SHARE_MEDIA.QQ;
                    break;
            }
        }
        String link = bean.getLink();

        UMWeb web = new UMWeb(link);
        web.setTitle(bean.getTitle());//標題
        web.setThumb(new UMImage(activity, bean.getIcon()));  //縮略圖
        web.setDescription(bean.getDesc());//描述

        new ShareAction(activity)
                .setPlatform(share_media)//傳入平臺
                .withText(bean.getTitle())//分享內容
                .withMedia(web)
                .setCallback(umShareListener)//回調監聽器
                .share();

    }

    /** * 下載文件監聽 跳轉瀏覽器下載 * * @param mWebView */
    public static void addDownLoadListener(Activity activity, WVJBWebView mWebView) {
        mWebView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
            if (!TextUtils.isEmpty(url)) {
                downloadByBrowser(activity, url);
            }
        });
    }

    public static void downloadByBrowser(Activity activity, String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.setData(Uri.parse(url));
        activity.startActivity(intent);
    }

    /** * 加載的url歷史堆棧信息 * * @param loadHistoryUrls:url數組信息 * @param mWebView * @param activity * @param isMain:是否爲首頁的tab頁面 */
    public static void receiverGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, Activity activity, boolean isMain, ImageView imageView) {
        //過濾是否爲重定向後的連接
        LogUtils.loge("網頁攔截中加載的url歷史堆棧信息:" + loadHistoryUrls.toString());
        if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
            if (loadHistoryUrls.size() > 2) {
                //移除加載棧中的最後兩個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            if (loadHistoryUrls.size() > 1) {
                //移除加載棧中的最後一個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            LogUtils.loge("攔截中後退的url歷史記錄" + loadHistoryUrls.toString());
            //加載重定向以前的頁
            if (isMain) {
                if (loadHistoryUrls.size() == 1) {
                    imageView.setVisibility(View.INVISIBLE);
                }
            }
            mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
        } else {
            activity.finish();

        }
    }

    /** * 清除歷史消息 * * @param mWebView */
    public static void clearWebInfo(WVJBWebView mWebView) {
        if (mWebView != null) {
            mWebView.clearHistory();
            mWebView.clearCache(true);
            mWebView.destroy();
        }
    }

    public static void onPressGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, ImageView imageView, Activity activity) {

        //過濾是否爲重定向後的連接
        LogUtils.loge("網頁攔截中加載的url歷史堆棧信息:" + loadHistoryUrls.toString());
        if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
            if (loadHistoryUrls.size() > 2) {
                //移除加載棧中的最後兩個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            if (loadHistoryUrls.size() > 1) {
                //移除加載棧中的最後一個連接
                loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
            }
            LogUtils.loge("攔截中後退的url歷史記錄" + loadHistoryUrls.toString());
            //加載重定向以前的頁
            if (loadHistoryUrls.size() == 1) {
                imageView.setVisibility(View.INVISIBLE);
            }
            mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
        } else {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                ToastUtil.showToast("再按一次退出程序");
                exitTime = System.currentTimeMillis();
            } else {
                activity.finish();
            }

        }
    }



    public  static  Uri  perImgUrl=null;

    public static boolean captureImageFromCamera(Activity activity, Uri imageUri) {
        File cacheDir = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            cacheDir = activity.getExternalCacheDir();
        }
        if (cacheDir == null) {
            cacheDir = activity.getCacheDir();
        }
        File outFile = new File(cacheDir, System.currentTimeMillis() + ".jpg");
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {//若是api大於Android api23 要替換獲取文件Uri方式
            //此方法第二個參數authority的值要用項目中的值來替換,可網上找Android 7.0 FileProvider相關介紹
            imageUri = FileProvider.getUriForFile(activity, "com.chelizi.xhc.provider.fileprovider", outFile);
            perImgUrl=imageUri;
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//加入flag
        } else {
            imageUri = Uri.fromFile(outFile);
            perImgUrl=imageUri;
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
        }
        if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {//有相機權限
            PackageManager packageManager = activity.getPackageManager();
            if (intent.resolveActivity(packageManager) != null) {
                try {
                    activity.startActivityForResult(intent, ConfigUtil.ActResultConstant.FILECHOOSER_RESULTCODE);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } else {//沒有相機權限
            // TODO: 這裏作請求相機權限的處理(網上找Android 6.0權限管理相關介紹)
            ToastUtil.showToast("請開啓相機權限");
        }
        return false;
    }



    public static Uri getImgeUrl(){
        return  perImgUrl;
    }


    /** * 調用系統相機拍攝視頻 */

    public static boolean captureVideoFromCamera(Activity activity, Uri imageUri) {
        File cacheDir = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            cacheDir = activity.getExternalCacheDir();
        }
        if (cacheDir == null) {
            cacheDir = activity.getCacheDir();
        }
        File outFile = new File(cacheDir, System.currentTimeMillis() + ".mp4");
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {//若是api大於Android api23 要替換獲取文件Uri方式
            //此方法第二個參數authority的值要用項目中的值來替換,可網上找Android 7.0 FileProvider相關介紹
            Uri uri = FileProvider.getUriForFile(activity, "com.chelizi.xhc.provider.fileprovider", outFile);
            perImgUrl=imageUri;
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//加入flag
        } else {
            Uri uri = Uri.fromFile(outFile);
            perImgUrl=imageUri;
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
        }
        //調系統相機拍攝視頻須要用到相機權限,先判斷有沒有這個權限
        if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {//有相機權限
            PackageManager packageManager = activity.getPackageManager();
            if (intent.resolveActivity(packageManager) != null) {
                try {
                    activity.startActivityForResult(intent, FILECHOOSER_VIDEO_RESULTCODE);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } else {//沒有相機權限
            // TODO: 這裏作請求相機權限的處理(網上找Android 6.0權限管理相關介紹)
            ToastUtil.showToast("請開啓相機權限");
        }
        return false;
    }



}

複製代碼

Webview.javaios

@Route(path = RouterUtil.WEBVIEW)
public class WebViewActivity extends BaseActivity implements View.OnClickListener {
    private final String AUTHTAG = "認證進度:";
    @BindView(R.id.web_view)
    WVJBWebView mWebView;
    @BindView(R.id.tv_tag_content)
    TextView mTvTagContent;
    @BindView(R.id.dialog_view)
    LinearLayout mDialogView;
    @BindView(R.id.progressbar)
    ProgressBar mProgressBar;
    @Autowired(name = "url")
    String url;

    @Autowired(name = "title")
    String title;


    @Autowired(name = "applySuccess")
    boolean isApplySuccess;

    @Autowired(name = "amount")
    String amount;

    @Autowired(name = "orderId")
    int orderId;
    /** * 發送與接收的廣播 **/

    @Autowired(name = "isMain")
    boolean isMain;


    @Autowired(name = "isCar")
    boolean isCar;

    @BindView(R.id.img_back)
    ImageView img_back;
    ValueCallback<Uri> uploadFile = null;
    ValueCallback<Uri[]> filePathCallback = null;
    private ArrayList<String> loadHistoryUrls = new ArrayList<String>();

    private Uri imageUri;

    @Override
    public int getLayoutId() {
        return R.layout.activity_loan_webview;
    }

    @Override
    public void initPresenter() {

    }

    @Override
    public void loadData() {
        ARouter.getInstance().inject(this);
        initView();


    }

    public void initView() {
        if (getIntent() != null) {
            if (!NormalRegUtil.isBlank(getIntent().getStringExtra("title"))) {
                title = getIntent().getStringExtra("title");
            }
        }


        //二手車
        if (isCar) {

        } else {
            BannerItem bean = SharedInfo.getInstance().getEntity(BannerItem.class);
            if (bean != null) {
                if (!url.contains(bean.getOrderContractUrl())) {
                    if (url.startsWith(ConfigUtil.H5Pre)
                            || url.startsWith(ConfigUtil.perBaseUrl)
                            || url.startsWith(ConfigUtil.perBaseUrlForHttp)) {//表示有多是協議
                        if (isApplySuccess) {//是借款申請成功後獲取的
                            url = url + "?token=" + UserInfoTool.getToken() + "&amount=" + amount + "&orderId=" + orderId;
                        } else {
                            url = url + "?token=" + UserInfoTool.getToken();
                        }

                    }
                }
            }

        }

        Log.i("網頁攔截中加載的url:", url + "");
        //把初始頁面Url加入
        loadHistoryUrls.add(url);
        mWebView.loadUrl(url);


        WebUtils.loadWebSetting(mWebView);


        mWebView.setWebChromeClient(new MyWebChromeClient());

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //將過濾到的url加入歷史棧中
                loadHistoryUrls.add(url);
                Log.i("網頁攔截中加載的url:", url);
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @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);


            }
        });


        WebUtils.addDownLoadListener(this, mWebView);


        WebUtils.loadWebJsMethod(this, mWebView);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        loadHistoryUrls.clear();
        WebUtils.clearWebInfo(mWebView);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);

    }

    @Override
    protected void onResume() {
        super.onResume();


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
        Uri uri = null;
        if (requestCode == FILECHOOSER_VIDEO_RESULTCODE && resultCode == RESULT_OK && data != null) {
            uri = data.getData();
        }
        if (requestCode == FILECHOOSER_RESULTCODE && resultCode == RESULT_OK) {
            uri = WebUtils.getImgeUrl();//拍照片data不會返回uri,用以前暫存下的
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//android 5.0及以上
            if (filePathCallback != null) {//將拍攝的照片或者視頻回調給H5
                if (uri != null) {
                    filePathCallback.onReceiveValue(new Uri[]{uri});
                } else {
                    filePathCallback.onReceiveValue(null);
                }
                filePathCallback = null;
            }
        } else {//android 5.0如下
            if (uploadFile != null) {//將拍攝的照片或者視頻回調給H5
                if (uri != null) {
                    uploadFile.onReceiveValue(uri);
                } else {
                    uploadFile.onReceiveValue(null);
                }
                uploadFile = null;
            }
        }


    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判斷是否能夠返回操做
        if (mWebView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    @OnClick({R.id.img_back})
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.img_back:
                WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);
                break;
        }
    }

    class MyWebChromeClient extends WebChromeClient {

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (newProgress == 100) {
                mProgressBar.setVisibility(View.GONE);
            } else {
                mProgressBar.setVisibility(View.VISIBLE);
                mProgressBar.setProgress(newProgress);
            }

        }

        @Override
        public void onReceivedTitle(WebView view, String webtitle) {
            super.onReceivedTitle(view, webtitle);
            LogUtils.logi("網頁標題:" + webtitle);
            if (!TextUtils.isEmpty(webtitle)) {
                mTitle.setTitle(false, null, webtitle);
            } else {
                mTitle.setTitle(false, null, "提現");
            }


        }

        //Android 5.0 及以上 必須重寫此方法
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            boolean fromCamera = fileChooserParams.isCaptureEnabled();
            String[] acceptTypes = fileChooserParams.getAcceptTypes();
            if (acceptTypes != null && acceptTypes.length > 0) {

                boolean isImage = false;
                for (String acceptType : acceptTypes) {
                    if (acceptType.contains("image")) {
                        isImage = true;
                        break;
                    }
                }
                if (isImage) {//處理圖片
                    if (fromCamera) {//只處理拍照
                        if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
                            WebViewActivity.this.filePathCallback = filePathCallback;//暫存,用於拍完照片後回調H5
                            return true;//返回true表示APP處理文件選擇
                        }
                    }
                }


                boolean isVideo = false;
                for (String acceptType : acceptTypes) {
                    if (acceptType.contains("video")) {
                        isVideo = true;
                        break;
                    }
                }
                if (isVideo) {//處理視頻
                    if (fromCamera) {//只處理拍攝視頻
                        if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
                            WebViewActivity.this.filePathCallback = filePathCallback;//暫存,用於拍攝完視頻後回調H5
                            return true;//返回true表示APP處理文件選擇
                        }
                    }
                }
            }
            return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
        }

        //Android 5.0 如下 必須重寫此方法
        public void openFileChooser(final ValueCallback<Uri> uploadFile, String acceptType, String capture) {
            LogUtils.loge("點擊文件的類型是:" + acceptType);
            boolean fromCamera = !TextUtils.isEmpty(capture);
            if (acceptType != null && acceptType.contains("video")) {//處理視頻
                if (fromCamera) {//只處理拍攝視頻
                    if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
                        WebViewActivity.this.uploadFile = uploadFile;//暫存,用於拍攝完視頻後回調H5
                        return;
                    }
                }
            }
            if (acceptType != null && acceptType.contains("image")) {//處理圖片
                if (fromCamera) {//只處理拍照
                    if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
                        WebViewActivity.this.uploadFile = uploadFile;//暫存,用於拍完照片後回調H5
                    }
                }
            }
        }

    }


}



複製代碼
相關文章
相關標籤/搜索