使用WebChromeClient无法在WebView Android 4.4.2中打开文件选择器 [英] can't open file chooser in WebView Android 4.4.2 using WebChromeClient
问题描述
在我的Web视图中,单击选择文件" 按钮.在三星7英寸平板电脑中,我想打开文件浏览器,但是我无法在 Android版本4.4中打开此文件浏览器.2 . 你能帮我吗? 这是我的代码.
In my webview by clicking "Choose File" button In samsung 7 inch tablet I want to open a File Browser, but I can't open this in Android Version 4.4.2. So can u plz help me for this? Here is my Code.
WebViewDemo.java
package com.example.webviewdemo;
import java.io.File;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.webkit.ConsoleMessage;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebSettings.PluginState;
import android.widget.ProgressBar;
import android.widget.Toast;
public class WebViewDemo extends Activity {
/** Called when the activity is first created. */
WebView web;
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
if(requestCode==FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode != RESULT_OK ? null
: intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show_web_view);
web = (WebView) findViewById(R.id.webView1);
web = new WebView(this);
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl("file:///android_asset/select.html");
web.setWebViewClient(new myWebClient());
web.setWebChromeClient(new WebChromeClient()
{
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
WebViewDemo.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
WebViewDemo.this.startActivityForResult(
Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}
//For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
WebViewDemo.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), WebViewDemo.FILECHOOSER_RESULTCODE );
}
});
setContentView(web);
}
public class myWebClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
}
//flipscreen not loading again
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
// To handle "Back" key press event for WebView to go back to previous screen.
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}*/
}
内部资产/select.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div data-role="page" id="pageone">
<div data-role="header">
<h1>PRODUCT DETAIL</h1>
</div>
<div data-role="content">
<form method="get" action="">
<div data-role="fieldcontain">
<label for="name">Open File Chosser And Select File From Camera :</label>
<input type="file" name="text" id="name" type="image/*" >
</div>
<div data-role="fieldcontain">
<label for="name">Email:</label>
<input type="text" name="text" id="name" value="" placeholder="What's Your Name?">
</div>
<div data-role="fieldcontain">
<label for="search">Looking for anything?</label>
<input type="search" name="search" id="search" value="" placeholder="Search for content"/>
</div>
<div data-role="fieldcontain">
<label for="colors"><a href="http://www.androidexample.com/media/webview/webview_browser.html">Open link in webview browser.</a></label>
<br>
<br>
<label for="colors"><a href="http://www.google.com/">Open link in new browser.</a></label>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
推荐答案
此处的问题是,在Android 4.4中未实现文件输入,它将永远无法通过标准WebView界面工作. 我在项目中所做的就是使用CrossWalk项目使其正常工作. 将默认的WebView从标准的Android更改为CrossWalk需要大量的工作,但是它确实很好地满足了我的需求.
The problem here is that in Android 4.4 the file input is not implemented and it will never work through the standard WebView interface. What I did in my project has been to use CrossWalk project to make it work fine. It has required quite a bit of work to change the default WebView from the standard Android one to CrossWalk, however it really served my needs quite well.
基本上,您需要用CrossWalk webView替换普通的Android WebView.这对我们没有什么好处,包括即使在Android 4.0、4.1等操作系统上Chrome也会进行更新,为我们提供了更好的支持和更少的错误.
Basically you need to replace the normal Android WebView with the CrossWalk webView. This had few advantages for us, including the fact that Chrome will be updated even on Android 4.0, 4.1 etc, giving us a much better support and fewer bugs.
I documented how I implemented it here: http://blog.maurizionapoleoni.com/blog/implementing-a-file-input-with-camera-support-in-android-with-crosswalk/
这篇关于使用WebChromeClient无法在WebView Android 4.4.2中打开文件选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!