android_WebView

WebView 增加橫向進度條

        progressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleHorizontal);

        progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 5, 0, 0));

        addView(progressBar);

WebView 設置屬性

        WebSettings ws = this.getSettings();

        ws.setJavaScriptEnabled(true);//允許javascript

        ws.setAllowFileAccess(true);啓用或禁用WebView訪問文件數據

        ws.setBuiltInZoomControls(false);設置是否支持縮放

        ws.setSupportZoom(true);設置是否支持變焦

        ws.setDomStorageEnabled(true);

        ws.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);設置佈局方式

        ws.setUserAgentString("");

setWebViewClient()

                @Override

                public boolean shouldOverrideUrlLoading(WebView view, String url) {

                    //覆蓋loadUrl方法,默認以瀏覽器打開URL

                }

               @Override

                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

                    //失敗回調

                    view.loadUrl("file:///android_asset/error.html");

                }

setWebChromeClient()

                @Override

                public void onProgressChanged(WebView view, int newProgress) {

                    if (newProgress == 100) {//加載進度條

                        progressBar.setVisibility(GONE);

                    } else {

                        if (progressBar.getVisibility() == GONE) {

                            progressBar.setVisibility(VISIBLE);

                        }

                        progressBar.setProgress(newProgress);

                    }

                }

                網頁彈出框重寫

                public boolean onJsAlert()

                onJsConfirm()

                onJsPrompt()

                //響應網頁File標籤,現實圖片上傳

                // 3.0 + 調用這個方法

                public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType) {

                mUploadMessage = uploadMsg;//mUploadMessage 全局變量

                //跳轉系統相冊

                Intent intent = new Intent(Intent.ACTION_PICK);

                intent.setType("image/*");// 相片類型

                BaseActivity.currentActivity().startActivityForResult(intent,                                                                                                                                      WebViewActivity.FILECHOOSER_RESULTCODE);

                //跳轉系統相機

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                BaseActivity.currentActivity().startActivityForResult(intent,

                                                                  WebViewActivity.FILECHOOSER_RESULTCODE);

                }

                // For Android  > 4.1.1

                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {

                    openFileChooser(uploadMsg, acceptType);

                }

                // Android < 3.0 調用這個方法

                public void openFileChooser(ValueCallback<Uri> uploadMsg) {

                    openFileChooser(uploadMsg, "");

                }

javascript調用本地方法

this.addJavascriptInterface(new JSAndroidBridge(this), "android");

執行JS方法,可通過參數向JS當前頁面傳值

public void executeJSMethod(String methodName, String param) {

        this.superLoadUrl("javascript:" + methodName + "('" + param + "')");

}

可供JS調用的類

public final class JSAndroidBridge {

        private JSBridgeWebView webView;

        public JSAndroidBridge(JSBridgeWebView webView) {

            super();

            this.webView = webView;

        }

        @JavascriptInterface

        public void refreshHomeActivityList() {//js可以通過方法名調用此方法

           //do something

        }

}

圖片上傳

    1.實現上面提到的openFileChooser(部分Android4.4.2不響應此方法)

    2.當前場景中onActivityResult中獲取URI

    3.uri不爲空是從相冊獲取的圖片,爲空是從相機獲得圖片

    4.部分相機獲取的圖片是縮略圖

    5.部分手機從系統獲取的圖片是橫向

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

        if (requestCode == FILECHOOSER_RESULTCODE) {

            mUploadMessage = .getWebView().getmUploadMessage();

            if (null == mUploadMessage)

                return;

            Uri uri = intent == null || resultCode != RESULT_OK ? null : intent.getData();

            }

            mUploadMessage.onReceiveValue(uri);//關鍵代碼

        }

}

圖片上傳過程中得問題及解決方案
Android4.4.2 不響應openFileChooser方法

    上面設置的setUserAgentString()方法中將當前系統版本傳到頁面,頁面判斷爲4.4.2系統不使用File標籤上傳圖片,改爲本地調用上傳圖片方法,上傳成功後返回的圖片路徑,調用js的方法通知頁面圖片上傳成功

選取圖片操作bitmap, OOM

    BitmapFactory.Options opt = new BitmapFactory.Options();

    opt.inJustDecodeBounds = true;//只獲取圖片參數

    BitmapFactory.decodeFile(img_path, opt);

    if (opt.outWidth > 1000 || opt.outHeight > 1000) {

    opt.inSampleSize = 5;//縮小1/5

    }

    opt.inJustDecodeBounds = false;

    Bitmap bitmap = BitmapFactory.decodeFile(img_path, opt);

判斷圖片的方向

 //獲取圖片的路徑

private String getImgPath(Uri uri){

        String img_path = "";

        if(uri != null){

            String[] proj = { MediaStore.Images.Media.DATA };

            Cursor actualimagecursor = managedQuery(uri,proj,null,null,null);

            int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

            actualimagecursor.moveToFirst();

            img_path = actualimagecursor.getString(actual_image_column_index);

        }

        return img_path;

    }

//獲取圖片的存儲角度

private int getBitmapDegree(String path) {

        int degree = 0;

        try {

            // 從指定路徑下讀取圖片,並獲取其EXIF信息

            ExifInterface exifInterface = new ExifInterface(path);

            // 獲取圖片的旋轉信息

            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,

                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {

                case ExifInterface.ORIENTATION_ROTATE_90:

                    degree = 90;

                    break;

                case ExifInterface.ORIENTATION_ROTATE_180:

                    degree = 180;

                    break;

                case ExifInterface.ORIENTATION_ROTATE_270:

                    degree = 270;

                    break;

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        return degree;

    }

//旋轉圖片

public Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {

        Bitmap returnBm = null;

        // 根據旋轉角度,生成旋轉矩陣

        Matrix matrix = new Matrix();

        matrix.postRotate(degree);

        try {

            // 將原始圖片按照旋轉矩陣進行旋轉,並得到新的圖片

            returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);

        } catch (OutOfMemoryError e) {

        }

        if (returnBm == null) {

            returnBm = bm;

        }

        if (bm != returnBm) {

            bm.recycle();

        }

        return returnBm;

    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章