Android三方庫jsbridge和HTML交互

1.這個三方庫用例也很多,使用方式也很簡單富玷,先看一下git網(wǎng)址
git傳送門:https://github.com/lzyzsd/JsBridge
2.使用方式,直接依賴

compile 'com.github.lzyzsd:jsbridge:1.0.4'

3.直接在自己的webview中寫吧磁携,我先把代碼放過來

  private void initView() {
        webView = (BridgeWebView) findViewById(R.id.webview);
        back = (LinearLayout) findViewById(R.id.back);
        title = (TextView) findViewById(R.id.title);
        rightBtn_click = (RelativeLayout) findViewById(R.id.rightBtn_click);
        rightBtn = (ImageView) findViewById(R.id.rightBtn);
        rightBtn_click.setVisibility(View.VISIBLE);
        rightBtn.setImageResource(R.mipmap.share);

        //返回
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                WebViewActivity.this.setResult(RESULT_OK);
                if (webView.canGoBack()) {
                    webView.goBack();
                } else {
                    finish();
                }
            }
        });

        //分享
        rightBtn_click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!TextUtils.isEmpty(shareurl)) {
                    //分享標題
                    sharename = title.getText().toString();
                    if (TextUtils.isEmpty(sharename)) {
                        sharename = getResources().getString(R.string.app_name);
                    }

                    ShareDialog shareDialog = new ShareDialog(WebViewActivity.this);
                    shareDialog.share(shareurl, sharename, sharesrc, sharedes, null, true);
                    shareDialog.show();

                } else {
                    ToastUtils.showToast(WebViewActivity.this, getString(R.string.data_err));
                }
            }
        });
        progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
    }


    private void initEvent() {

        WebSettings websettings = webView.getSettings();
        websettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        websettings.setLoadsImagesAutomatically(true);
        websettings.setJavaScriptEnabled(true);
        websettings.setUseWideViewPort(true);
        websettings.setSupportZoom(true);
        websettings.setSupportMultipleWindows(true);
        websettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        websettings.setBuiltInZoomControls(true);
        websettings.setSupportZoom(true);
        websettings.setJavaScriptCanOpenWindowsAutomatically(true);
        websettings.setAppCacheEnabled(true);

        webView.setDefaultHandler(new DefaultHandler());
        webView.setWebViewClient(new MyWebViewClient(webView));
        webView.setWebChromeClient(new WebChromeClient() {

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

            }

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {
                this.openFileChooser(uploadMsg);
            }

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {
                this.openFileChooser(uploadMsg);
            }

            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                mUploadMessage = uploadMsg;
                initPermission();
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                mUploadMessageArray = filePathCallback;
                initPermission();
                return true;
            }
        });

        webView.loadUrl(url);

        webView.registerHandler("save", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
                if (!TextUtils.isEmpty(data)) {
                    if (data.endsWith(".png") || data.endsWith(".jpg") || data.endsWith("jpeg")) {
                        DownLoadManager.downLoadImage(context, data);
                    } else {
                        ToastUtils.showToast(WebViewActivity.this, getResources().getString(R.string.okgofail));
                    }

                }
                function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");

            }
        });

        webView.registerHandler("goLogin", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
                if (!TextUtils.isEmpty(data)) {
                    CommonUtils.toLogin(WebViewActivity.this);
                }
                function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");

            }
        });


        webView.registerHandler("toBookDetail", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
                if (!TextUtils.isEmpty(data)) {
                    WebViewBean webViewBean = new Gson().fromJson(data, new TypeToken<WebViewBean>() {
                    }.getType());
                    if (!TextUtils.isEmpty(webViewBean.getBookId())) {
                        Intent intent = new Intent(WebViewActivity.this, BookDetailActivity.class);
                        intent.putExtra(SPUtils.K_BOOKID, webViewBean.getBookId());
                        intent.putExtra(SPUtils.K_TITLE, "");
                        startActivity(intent);
                    } else {
                        showToast(getResources().getString(R.string.okgofail));
                    }
                }
                function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");

            }
        });

    }

    private class MyWebViewClient extends BridgeWebViewClient {


        public MyWebViewClient(BridgeWebView webView) {
            super(webView);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String 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);

            //獲取HTML的title
            String titles = view.getTitle();
            if (!TextUtils.isEmpty(titles)) {
                title.setText(titles);
                sharename = titles;
            }
            if (TextUtils.isEmpty(sharedes)) {
                sharedes = getResources().getString(R.string.app_name);
            }
            //加載結束后去掉加載框
            dismissLoading();
            if (!WebViewActivity.this.isDestroyed() || !WebViewActivity.this.isFinishing()) {
                webView.callHandler("checkAPP", "android", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) {
                        Log.i(TAG, "回傳結果:" + data);
                    }
                });

            }
        }
    }


    /**
     * Back鍵控制網(wǎng)頁后退
     *
     * @param
     * @param
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        WebViewActivity.this.setResult(RESULT_OK);
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 在 Activity 銷毀( WebView )的時候酌摇,先讓 WebView 加載null內(nèi)容,然后移除 WebView驰坊,再銷毀 WebView匾二,最后置空。
     *
     * @param
     * @param
     */
    @Override
    protected void onDestroy() {
        if (webView != null) {
            webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            webView.clearHistory();

            ((ViewGroup) webView.getParent()).removeView(webView);
            webView.destroy();
            webView = null;
        }
        super.onDestroy();


    }


    private void initPermission() {
        // 申請權限。
        PermissionUtils.permission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE).callBack(new PermissionUtils.PermissionCallBack() {
            @Override
            public void onGranted(PermissionUtils permissionUtils) {
                PictureSelector.create(WebViewActivity.this)
                        .openGallery(PictureMimeType.ofImage())
                        .maxSelectNum(Integer.MAX_VALUE)// 最大圖片選擇數(shù)量 int
                        .isCamera(true)// 是否顯示拍照按鈕
                        .isZoomAnim(true)// 圖片列表點擊 縮放效果 默認true
//                                .enableCrop(true)// 是否裁剪
                        .compress(true)// 是否壓縮
                        .synOrAsy(true)//同步true或異步false 壓縮 默認同步
//                                .withAspectRatio(3, 2)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定義
                        .glideOverride(160, 160)// glide 加載寬高察藐,越小圖片列表越流暢皮璧,但會影響列表圖片瀏覽的清晰度
                        .hideBottomControls(true)// 是否顯示uCrop工具欄,默認不顯示
                        .isGif(false)// 是否顯示gif圖片
//                                .freeStyleCropEnabled(true)// 裁剪框是否可拖拽
//                                .circleDimmedLayer(true)// 是否圓形裁剪
//                                .showCropFrame(false)// 是否顯示裁剪矩形邊框 圓形裁剪時建議設為false
//                                .showCropGrid(true)// 是否顯示裁剪矩形網(wǎng)格 圓形裁剪時建議設為false
//                                .selectionMedia(selectList)// 是否傳入已選圖片
                        .forResult(PictureConfig.CHOOSE_REQUEST);
            }

            @Override
            public void onDenied(PermissionUtils permissionUtils) {

                ToastTintUtils.error("請打開您的相機和存儲權限");
            }
        }).request();

    }


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

        switch (requestCode) {
            case PictureConfig.CHOOSE_REQUEST:
                // 圖片選擇結果回調(diào)
                selectList = PictureSelector.obtainMultipleResult(data);
                // 例如 LocalMedia 里面返回三種path
                // 1.media.getPath(); 為原圖path
                // 2.media.getCutPath();為裁剪后path分飞,需判斷media.isCut();是否為true
                // 3.media.getCompressPath();為壓縮后path悴务,需判斷media.isCompressed();是否為true
                // 如果裁剪并壓縮了,已取壓縮路徑為準譬猫,因為是先裁剪后壓縮的
                List<Uri> list = new ArrayList<>();
                for (LocalMedia media : selectList) {
                    Log.i("圖片-----》", media.getPath());
                    iconPath = media.getPath();
                    list.add(Uri.fromFile(new File(iconPath)));
                }
                if (list != null && list.size() > 0) {
                    if (mUploadMessageArray != null) {
//                            Uri[] uris = new Uri[]{Uri.fromFile(new File(iconPath))};
                        Uri[] uris = new Uri[list.size()];
                        for (int i = 0; i < list.size(); i++) {
                            uris[i] = list.get(i);
                        }
                        Logger.e("ttt" + uris.toString());
                        mUploadMessageArray.onReceiveValue(uris);
                        mUploadMessageArray = null;

                    } else if (mUploadMessage != null) {
                        mUploadMessage.onReceiveValue(Uri.fromFile(new File(iconPath)));
                        mUploadMessage = null;
                    } else {
                        Toast.makeText(context, "獲取圖片失敗讯檐,請稍后重試", Toast.LENGTH_LONG).show();
                    }
                } else {
                    cancelFilePathCallback();
                }
                break;
        }
    }

    /**
     * 取消mFilePathCallback回調(diào)
     */
    private void cancelFilePathCallback() {
        if (mUploadMessage != null) {
            mUploadMessage.onReceiveValue(null);
            mUploadMessage = null;
        } else if (mUploadMessageArray != null) {
            mUploadMessageArray.onReceiveValue(null);
            mUploadMessageArray = null;
        }
    }

4.這份代碼是基本的生命webview在布局中要寫的

  <com.github.lzyzsd.jsbridge.BridgeWebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

這個代碼有選擇相冊的功能,還有寫的句柄染服,來回調(diào)用用的别洪,先說訪問相冊,這個跟iOS沒法比柳刮,我們要自己寫調(diào)起相冊的功能挖垛,使用的是一個三方庫,選擇照片后回調(diào)秉颗,這里說一下痢毒,避免選擇后不能再次選擇問題,所以有了一個取消mFilePathCallback回調(diào)
其次句柄:
HTML調(diào)用我的方法站宗,首先我注冊一個方法闸准,等他觸發(fā)

        webView.registerHandler("save", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
                if (!TextUtils.isEmpty(data)) {
                    if (data.endsWith(".png") || data.endsWith(".jpg") || data.endsWith("jpeg")) {
                        DownLoadManager.downLoadImage(context, data);
                    } else {
                        ToastUtils.showToast(WebViewActivity.this, getResources().getString(R.string.okgofail));
                    }

                }
                function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");

            }
        });

然后是HTML注冊方法,APP調(diào)用

       webView.callHandler("checkAPP", "android", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) {
                        Log.i(TAG, "回傳結果:" + data);
                    }
                });

基本用法就這樣梢灭,記得訪問相冊的時候判斷一下權限

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夷家,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敏释,更是在濱河造成了極大的恐慌库快,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钥顽,死亡現(xiàn)場離奇詭異义屏,居然都是意外死亡,警方通過查閱死者的電腦和手機蜂大,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門闽铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奶浦,你說我怎么就攤上這事兄墅。” “怎么了澳叉?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵隙咸,是天一觀的道長沐悦。 經(jīng)常有香客問我,道長五督,這世上最難降的妖魔是什么藏否? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮充包,結果婚禮上副签,老公的妹妹穿的比我還像新娘。我一直安慰自己误证,他們只是感情好继薛,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愈捅,像睡著了一般遏考。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝谨,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天灌具,我揣著相機與錄音,去河邊找鬼譬巫。 笑死咖楣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芦昔。 我是一名探鬼主播诱贿,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咕缎!你這毒婦竟也來了珠十?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凭豪,失蹤者是張志新(化名)和其女友劉穎焙蹭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫂伞,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡孔厉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帖努。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撰豺。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拼余,靈堂內(nèi)的尸體忽然破棺而出郑趁,到底是詐尸還是另有隱情,我是刑警寧澤姿搜,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布寡润,位于F島的核電站,受9級特大地震影響舅柜,放射性物質(zhì)發(fā)生泄漏梭纹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一致份、第九天 我趴在偏房一處隱蔽的房頂上張望变抽。 院中可真熱鬧,春花似錦氮块、人聲如沸绍载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽击儡。三九已至,卻和暖如春蝠引,著一層夾襖步出監(jiān)牢的瞬間阳谍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工螃概, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矫夯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓吊洼,卻偏偏與公主長得像训貌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冒窍,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容