WebView中打不开文件管理器

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;  
}  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Webview 本身是一个视图控件,用于在 Android 应用程序显示 Web 页面。它不支持直接下载文件流,但是你可以通过以下步骤实现将文件流下载并保存到手机本地: 1. 在 Webview 加载下载链接,当用户点击下载链接时,会触发 Webview 的 shouldOverrideUrlLoading 方法。 2. 在 shouldOverrideUrlLoading 方法,捕获下载链接,并使用 Android 系统自带的 DownloadManager 进行文件下载。 3. 在下载完成后,使用 Android 系统自带的 FileProvider 将文件流共享给其他应用程序,比如浏览器或文件管理器。 以下是示例代码: ```java public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.web_view); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http://") || url.startsWith("https://")) { view.loadUrl(url); return true; } else { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setMimeType("application/octet-stream"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "my_file.pdf"); DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); downloadManager.enqueue(request); return true; } } }); webView.loadUrl("https://example.com/my_file.pdf"); } } ``` 注意:需要添加以下权限到 AndroidManifest.xml 文件: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值