Android WebView相冊選取圖片及集成(X5內核,crosswalk)

webview加載商城連接地址,系統webview的加載商城裏的一個分類頁面卡頓,其餘頁面正常。
在這裏插入圖片描述

自己寫webview顯然不現實,繼承系統的寫出來效果還是如此,然後就集成了騰訊X5的內核。

  1. TBS(騰訊瀏覽服務)的優勢
  1. 速度快:相比系統webview的網頁打開速度有30+%的提升;

  2. 省流量:使用雲端優化技術使流量節省20+%;

  3. 更安全:安全問題可以在24小時內修復;

  4. 更穩定:經過億級用戶的使用考驗,CRASH率低於0.15%;

  5. 兼容好:無系統內核的碎片化問題,更少的兼容性問題;

  6. 體驗優:支持夜間模式、適屏排版、字體設置等瀏覽增強功能;

  7. 功能全:在Html5、ES6上有更完整支持;

  8. 更強大:集成強大的視頻播放器,支持視頻格式遠多於系統webview;

  9. 視頻和文件格式的支持x5內核多於系統內核

  10. 防劫持是x5內核的一大亮點

下載X5的sdk,導入studio,application初始化x5內核
在這裏插入圖片描述

//蒐集本地tbs內核信息並上報服務器,服務器返回結果決定使用哪個內核。

	private void initX5WebView() {
		QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
			@Override
			public void onViewInitFinished(boolean arg0) {
				//x5內核初始化完成的回調,爲true表示x5內核加載成功,否則表示x5內核加載失敗,會自動切換到系統內核。
				Log.d("app", " onViewInitFinished is " + arg0);
			}
 
			@Override
			public void onCoreInitFinished() {
			}
		};
		//x5內核初始化接口
		QbSdk.initX5Environment(getApplicationContext(), cb);
		}

將原來系統的webview換成騰訊x5的,(包名和佈局),儘可能將項目所有的webview都換了,官網有檢測器,可以下載一個檢測一遍,對着檢測結果一一更換;

        mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);//開啓硬件加速
        mWebView.loadUrl(SysParam.shoppingMall);
        settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setLoadsImagesAutomatically(true);
        settings.setDomStorageEnabled(true);
        settings.setUseWideViewPort(true);  //自適應屏幕
        settings.setLoadWithOverviewMode(true);//自適應,alert文本問題
        settings.setSupportMultipleWindows(true);
        settings.setAllowFileAccess(true);//設置可以訪問文件
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        mWebView.loadUrl(SysParam.shoppingMall); //默認加載的商城地址

x5和系統自帶webview方法差不讀,基本就換了個包名,商城裏需要更換頭像,webview裏封裝的方法直接供開發調用

    private ValueCallback<Uri> mFilePathCallback4;
    private ValueCallback<Uri[]> mFilePathCallback5;

    webView.setWebChromeClient(new WebChromeClient(){
            //  3.0
            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
                 mFilePathCallback4 = valueCallback;
                openPhoto();//調用相冊方法
            }

            // 4.1
            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
               mFilePathCallback4 = valueCallback;
                openPhoto();
            }

            //  5.0以上
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                mFilePathCallback5 = filePathCallback;
                openPhoto();
                return true;
            }
      }

openFileChooser方法需要自己寫,重寫現在不提示這個方法,只有5.0以上的onShowFileChooser提示

/**
     * 訪問相冊,用的takephoto,需要的可以github集成一下,訪問相冊也可以自己寫
     */
    private void openPhoto() {
        takePhoto.onPickMultiple(1);
    }

takephoot回調方法裏判斷版本號,將圖片返回給h5頁面

@Override
    public void takeSuccess(TResult result) {
     if (Build.VERSION.SDK_INT > 21) {
            Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
            Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
            mFilePathCallback5.onReceiveValue(new Uri[]{imageUri});
            mFilePathCallback5 = null;
        } else {
            Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
            Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
            mFilePathCallback4.onReceiveValue(imageUri);
            mFilePathCallback4 = null;
        }
 }

跑起來確實流程,裏面頁面立馬不卡頓了,過兩天出現一個問題,第一次運行很順暢,退出app,殺掉後臺,在進入app加載商城,非常緩慢,卡的還不如系統的,很是蹊蹺,去官網文檔沒有一個辦法解決,就只能撐一次這肯定不行,沒辦法,逼得把X5的內核換成了walkview。
walkview依賴:

//project
allprojects {
    repositories {
        maven { url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2' }
        jcenter()
        google()
    }
}
   //module
    implementation 'org.xwalk:xwalk_core_library:23.53.589.4'

walkview設置屬性具體和weview,x5的一樣,其餘的變了不少,例如監聽的:webviewclient換成了setResourceClient,webchromeclient換成了setUIClient;

 mWebView.setResourceClient(new MyWebViewClient(mWebView));
        mWebView.setUIClient(new XWalkUIClient(mWebView) {
        //walkview選擇文件就一個方法
            @Override
            public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) {
                mFilePathCallback4 = uploadFile;
                openPhoto();
            }
        });
      

對應的takeSuccess回調就不用判斷了,只返回ValueCallback mFilePathCallback4即可,不用再返回數組

    @Override
    public void takeSuccess(TResult result) {
//        if (Build.VERSION.SDK_INT > 21) {
//            Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
//            Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
//            mFilePathCallback5.onReceiveValue(new Uri[]{imageUri});
//            mFilePathCallback5 = null;
//        } else {
        Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
        Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
        mFilePathCallback4.onReceiveValue(imageUri);
        mFilePathCallback4 = null;
        // }
    }

walkview返回鍵

 public void clickBack(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_BACK && mWebView.getNavigationHistory().canGoBack()) {
            //返回上一層
            mWebView.getNavigationHistory().navigate(XWalkNavigationHistory.Direction.BACKWARD, 1);
        } 
  }

一波三折的,爲了webview煞費苦心,回頭再看看x5,看能否找到解決辦法,再換回x5內核。本人還是感覺x5的好一些,順暢,體積不大,但項目問題只能割捨了,walkview也很好,但是體積大的離譜啊,打包出來體積打了20M,只再原來基礎上支持了’armeabi-v7a’的機型

 ndk {
      abiFilters 'armeabi','armeabi-v7a'
     }

在這裏插入圖片描述
walkview精簡版體積少了一小半,主要不是太穩定,最後還是用的穩定版的。
文檔地址:crosswalk官網
記錄一下把,那天忘了再翻翻看!

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