Android webview在默认情况下是不支持网页中的文件上传功能的;
如果在网页中有,在android webview中访问时也会出现浏览文件的按钮
但是点击按钮之后没有反应...
那么如何能够让android的webview能够响应,这个浏览按钮呢?在网上查了很多资料,很多相同的,但都漏掉了一个地方,导致无法读取到文件的完整地址(“c:upfile233232.jpg”),整理最终代码入下:
我们需要为webview设置WebChromeClient,在WebChromeClient的实现类中覆盖文件选择的方法:
代码如下 | 复制代码 |
packagecom.example.webviewupfile;
importjava.io.File; importjava.io.IOException;
importandroid.app.Activity; importandroid.content.ContentResolver; importandroid.content.Intent; importandroid.content.res.Configuration; importandroid.database.Cursor; importandroid.graphics.Bitmap; importandroid.net.Uri; importandroid.os.Bundle; importandroid.provider.MediaStore; importandroid.util.Log; importandroid.view.View; importandroid.webkit.ValueCallback; importandroid.webkit.WebChromeClient; importandroid.webkit.WebView; importandroid.webkit.WebViewClient; importandroid.widget.ProgressBar;
publicclassMainActivityextendsActivity { privateValueCallback privatefinalstaticintFILECHOOSER_RESULTCODE =1; privateWebView web; privateProgressBar progressBar;
@Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
web = (WebView) findViewById(R.id.webView1); progressBar = (ProgressBar) findViewById(R.id.progressBar1);
web =newWebView(this); web.getSettings().setJavaScriptEnabled(true); web.loadUrl("http://ueditor.baidu.com/website/onlinedemo.html"); web.setWebViewClient(newmyWebClient()); web.setWebChromeClient(newWebChromeClient() { // The undocumented magic method override // Eclipse will swear at you if you try to put @Override here // For Android 3.0+ publicvoidopenFileChooser(ValueCallback
mUploadMessage = uploadMsg; Intent i =newIntent(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+ publicvoidopenFileChooser(ValueCallback uploadMsg, String acceptType) { mUploadMessage = uploadMsg; Intent i =newIntent(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 publicvoidopenFileChooser(ValueCallback String acceptType, String capture) { mUploadMessage = uploadMsg; Intent i =newIntent(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); }
@Override protectedvoidonActivityResult(intrequestCode,intresultCode, 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; Bitmap bm =null; //外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口 ContentResolver resolver = getContentResolver(); try{ Uri originalUri = intent.getData();// 获得图片的uri bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); // 这里开始的第二部分,获取图片的路径: String[] proj = { MediaStore.Images.Media.DATA }; // 好像是android多媒体数据库的封装接口,具体的看Android文档 Cursor cursor = managedQuery(originalUri, proj,null,null, null); // 按我个人理解 这个是获得用户选择的图片的索引值 intcolumn_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); // 将光标移至开头 ,这个很重要,不小心很容易引起越界 cursor.moveToFirst(); // 最后根据索引值获取图片路径
String path = cursor.getString(column_index); Uri uri = Uri.fromFile(newFile(path)); mUploadMessage.onReceiveValue(uri); }catch(IOException e) {
Log.e("TAG-->Error", e.toString());
} } }
publicclassmyWebClientextendsWebViewClient { @Override publicvoidonPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); }
@Override publicbooleanshouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub
view.loadUrl(url); returntrue;
}
@Override publicvoidonPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE); } }
// flipscreen not loading again @Override publicvoidonConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); }
// To handle "Back" key press event for WebView to go back to previous // screen. /* *@OverridepublicbooleanonKeyDown(intkeyCode, KeyEvent event) {if * ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack(); *returntrue; }returnsuper.onKeyDown(keyCode, event); } */ } |
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔