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); } */ } |