WebView中打不开文件管理器

本文介绍如何通过重写WebChromeClient的openFileChooser和onShowFileChooser方法来禁用WebView中的文件管理器功能,并提供适用于不同Android版本的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WebView把打开文件管理器的功能给关闭了,要重写setWebChromeClientopenFileChooser(三个都要重写)和onShowFileChooser方法(因为5.0回调的不是openFileChooser而是onShowFileChooser),代码如下

//WebChromeClient的几个方法:
public void openFileChooser(ValueCallback<Uri> uploadMsg) {  
            Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg)");  
            mUploadMessage = uploadMsg;  
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
            i.addCategory(Intent.CATEGORY_OPENABLE);  
            i.setType("*/*");  
            MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);  

public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {  
            this.openFileChooser(uploadMsg);
}
 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){  
            this.openFileChooser(uploadMsg);
}

// For Android 5.0+  
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {  
         mUploadCallbackAboveL = filePathCallback;  
         Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
         i.addCategory(Intent.CATEGORY_OPENABLE);  
         i.setType("*/*");  
         MainActivity.this.startActivityForResult(  
                    Intent.createChooser(i, "File Browser"),  
                    FILECHOOSER_RESULTCODE);  
         return true;  
        }  
});
//Activity的方法:
@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);  
    if(requestCode==FILECHOOSER_RESULTCODE)  
    {  
        if (null == mUploadMessage && null == mUploadCallbackAboveL) return;  
        Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();  
        if (mUploadCallbackAboveL != null) {  
            onActivityResultAboveL(requestCode, resultCode, data);  
        }  
        else  if (mUploadMessage != null) {  
            mUploadMessage.onReceiveValue(result);  
            mUploadMessage = null;  
        }  
    }  
}    
@TargetApi(Build.VERSION_CODES.LOLLIPOP)  
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {  
    if (requestCode != FILECHOOSER_RESULTCODE  
            || mUploadCallbackAboveL == null) {  
        return;  
    }  
    Uri[] results = null;  
    if (resultCode == Activity.RESULT_OK) {  
        if (data == null) {  
        } else {  
            String dataString = data.getDataString();  
            ClipData clipData = data.getClipData();  
            if (clipData != null) {  
                results = new Uri[clipData.getItemCount()];  
                for (int i = 0; i < clipData.getItemCount(); i++) {  
                    ClipData.Item item = clipData.getItemAt(i);  
                    results[i] = item.getUri();  
                }  
            }  
            if (dataString != null)  
                results = new Uri[]{Uri.parse(dataString)};  
        }  
    }  
    mUploadCallbackAboveL.onReceiveValue(results);  
    mUploadCallbackAboveL = null;  
    return;  
}  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值