问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何完美解决android webview支持input type = file

发布网友 发布时间:2022-04-30 19:53

我来回答

1个回答

热心网友 时间:2022-06-30 07:06

在Android中,当我们通过WebView打开一个页面时,如果里面有元素是<input type=”file”…>类型的,WebView只能正常的显示样式,但是是无法点击的。要解决这个问题,我们需要重写WebChromeClient。
下面直接给出Demo代码:
Activity文件:
public class MainActivity extends Activity {

private final String host = "demo.com";
private final String urlAddress = "http://" + host;

private WebView web;
private ProgressBar progressBar;

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;
}
}

/**
* Called when the activity is first created.
*/
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

web = (WebView) findViewById(R.id.webView1);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);

WebSettings settings = web.getSettings();
settings.setJavaScriptEnabled(true);
web.loadUrl(urlAddress);
web.setWebViewClient(new MyWebViewClient());

web.setWebChromeClient(new WebChromeClient() {
//关键代码,以下函数是没有API文档的,所以在Eclipse中会报错,如果添加了@Override关键字在这里的话。

// 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/*");
MainActivity.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("*/*");
MainActivity.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/*");
MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FILECHOOSER_RESULTCODE);

}
});

//setContentView(web);
}

private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals(host)) {
// This is my web site, so do not override; let my WebView load the page
return false;
}
// Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}

@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);

progressBar.setVisibility(View.GONE);
}
}

//flipscreen not loading again
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

// 捕捉“回退”按键,让WebView能回退到上一页,而不是直接关闭Activity。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...养了好长时间,就开一个小花,请问谁知道如何开花! 李启尚百科名片 熊宝豆丁公司简介 年满多少岁贩毒应负刑事责任 年满多少周岁的人贩毒要负刑事责任 已满多少周岁的人贩毒担刑事责任 多少岁的人贩毒应当负刑事责任 五月天后来的我们歌词五月天后来的我们歌词简单介绍 厄瓜多尔虾安全吗? 独库公路吃住玩攻略_穷游怎么解决吃住 Android WebView调用页面如何使页面适应控件大小 android webview怎么充满屏幕 android 怎么让webview缩小和放大 对于android中的webview对js动画支持不好的情况各位都是如何解决... android webview 怎么放大缩小 androidwebview怎么优化和方法 Android webview中增加全局的请求头 如何加速Android WebView页面加载 最有效美白牙齿的方法是什么? excel表格里的链接怎么使用 excel表格内数据链接怎么做的 如何用excel做表格内链接 EXCEL一个表格内如何创建多个链接 Microsoft 软件是什么 怎样能把手机号留在网上。让别人经常打电话推销东西给我? 在某培训网站上留了手机号码,他们就经常打电话过来骚扰 有人在网上恶意留我的电话,我不断被业务员*扰,请问怎么处理合适(除了将电话号码设置黑名单以外) 寻傣族歌曲啊... 我最近老是收到*扰电话说是我在网上留的电话号码给他们的,可我没有啊,怎么办 呢? 新浪微博如何插入微博正文 如下图,我自己复制微博链接,在正文中显示的是网页链接字样,而不是微博正文 不用手机号码可以注册吗? 没有手机号可以注册吗? 不用手机号怎么申请注册新账号 如何查看mssql数据库的连接数以及指定用户的连接信息小结 不用手机号怎么申请注册新账号 中信银行理财宝白金卡有年费吗? 脸颊红烫是怎么回事 中信银行信用卡白金卡不激活有没有年费?&#x055E;&#xF603;&#x055E; 不用手机号可以申请 安评机构甲级资质申请条件 新飞空调遥控器 型号是KFR-25G/D23A 去哪买合适的遥控器啊 急急急急 新飞空调用哪种型号的万能遥控器好 中信银行白金卡多要年费的吗? 新飞空调在恒力万能遥控器的代码是多少 做安全评价需要什么证 全国供电规则功率因素不低于多少 提高功率因数的原则? 我想下载个怎么下载 公路 安全性评价报告需要什么资质 可以做? 提高功率因数的要求