腾讯x5 WebView选择文件的正确姿势
生活随笔
收集整理的這篇文章主要介紹了
腾讯x5 WebView选择文件的正确姿势
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
騰訊x5 WebView選擇文件的正確姿勢(shì)
將項(xiàng)目中的webview換成x5以后突然今天有個(gè)上傳圖片的功能要實(shí)現(xiàn),但是原本好好的上傳邏輯報(bào)錯(cuò)了,有點(diǎn)慌,但是也不慌,一想就是x5搞的鬼。然后就開始跟源碼,找方案,,,最后順利解決。看了網(wǎng)上沒有相關(guān)例子,記錄一下,免得后生們踩坑
報(bào)錯(cuò)信息如下圖
Caused by: java.lang.IllegalStateException: showFileChooser result was already called
分析以下代碼可能是由于onReceiveValue調(diào)用了多次導(dǎo)致的
public interface ValueCallback<T> extends android.webkit.ValueCallback<T> {void onReceiveValue(T var1); }原生webview的常規(guī)寫法要適配不同版本,如下
mWebView.setWebChromeClient(new WebChromeClient() {//以下是在各個(gè)Android版本中 WebView調(diào)用文件選擇器的方法// For Android < 3.0public void openFileChooser(ValueCallback<Uri> valueCallback) {openImageChooserActivity(valueCallback);}// For Android >= 3.0public void openFileChooser(ValueCallback valueCallback, String acceptType) {openImageChooserActivity(valueCallback);}//For Android >= 4.1@Overridepublic void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture) {openImageChooserActivity(valueCallback);}// For Android >= 5.0@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic boolean onShowFileChooser(WebView webView,ValueCallback<Uri[]> filePathCallback,FileChooserParams fileChooserParams) {mValueCallback2 = filePathCallback;Intent intent = fileChooserParams.createIntent();startActivityForResult(intent, CHOOSE_ANDROID_5);return true;}});但是x5內(nèi)部是做了適配的,只要實(shí)現(xiàn)一個(gè)方法即可
public void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture){}注意:這里千萬不要調(diào)用super
完整的x5選擇文件如下
private final int CHOOSE_REQUEST_CODE = 1000;private ValueCallback<Uri> mValueCallback;private void webViewSettings() {mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture) {openImageChooserActivity(valueCallback);}});}private void openImageChooserActivity(ValueCallback<Uri> valueCallback) {mValueCallback = valueCallback;Intent intent = new Intent();if (Build.VERSION.SDK_INT < 19) {intent.setAction(Intent.ACTION_GET_CONTENT);} else {intent.setAction(Intent.ACTION_PICK);intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);}intent.setType("image/*");((MyPinkFamilyActivity) mContext).startActivityForResult(Intent.createChooser(intent,"選擇圖片",CHOOSE_REQUEST_CODE);}public void onActivityResult(int requestCode, int resultCode, Intent intent) {switch (requestCode) {case CHOOSE://以下選擇圖片后的回調(diào)processResult(resultCode, intent);break;}}private void processResult(int resultCode, Intent intent) {if (mValueCallback == null) {return;}if (resultCode == Activity.RESULT_OK && intent != null) {Uri result = intent.getData();mValueCallback.onReceiveValue(result);} else {mValueCallback.onReceiveValue(null);}mValueCallback = null;}總結(jié)
遇事不慌,從源碼出手!希望對(duì)你有所幫助。。。少走彎路,多點(diǎn)時(shí)間陪陪家人
總結(jié)
以上是生活随笔為你收集整理的腾讯x5 WebView选择文件的正确姿势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。