android中使用WebView来打开本机的文件选择器支持4.0以上版本
2013-01-09 19:16
731 查看
网页上的button定义 <input tyoe="file" />重要:
FILECHOOSER_RESULTCODE = 1方法一,也是网上能搜到最多的解决方案参考网址:http://stackoverflow.com/questions/4944102/android-webview-file-input-field-filechooser-doesnt-show-up http://m0s-programming.blogspot.tw/2011/02/file-upload-in-through-webview-on.html
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } }在WebChromeClient的设定中加入如下代码:
setting.setWebChromeClient(new WebChromeClient() { // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); startActivityForResult( Intent.createChooser( i, "File Chooser" ), BrowserActivity.FILECHOOSER_RESULTCODE ); } // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser( uploadMsg, "" ); } }); // For Android > 4.1.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); }openFileChooser为隐藏方法。 这样可以实现打开目录上传文件。不过在3.0以后的版本中,如果同样的网页在android自带的浏览器打开会发现, 还有照相,录音的功能,然后直接将生成的图片或音频文件上传,这样就要使用下面的方法。方法二,参考自com.android.browser的源码程式。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (result == null && data == null && resultCode == Activity.RESULT_OK) { File cameraFile = new File(mCameraFilePath); if (cameraFile.exists()) { result = Uri.fromFile(cameraFile); // Broadcast to the media scanner that we have a new photo // so it will be added into the gallery for the user. sendBroadcast( new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result)); } } mUploadMessage.onReceiveValue(result); mUploadMessage = null; } }在WebChromeClient的设定中加入如下代码:
setting.setWebChromeClient(new WebChromeClient() { // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; startActivityForResult(createDefaultOpenableIntent(), BrowserActivity.FILECHOOSER_RESULTCODE); } } // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser( uploadMsg, "" ); } });// 重要:原代码漏掉下面定义private String mCameraFilePath;
private Intent createDefaultOpenableIntent() { // Create and return a chooser with the default OPENABLE // actions including the camera, camcorder and sound // recorder where available. Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(), createSoundRecorderIntent()); chooser.putExtra(Intent.EXTRA_INTENT, i); return chooser; } private Intent createChooserIntent(Intent... intents) { Intent chooser = new Intent(Intent.ACTION_CHOOSER); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents); chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser"); return chooser; } private Intent createCameraIntent() {
// 注意:此处代码主要目的是将拍照文件保存在 browser-photos 文件夹下(非系统默认文件夹)// 如不需要这样处理,可以简化代码Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);File cameraDataDir = new File(externalDataDir.getAbsolutePath() +File.separator + "browser-photos");cameraDataDir.mkdirs();mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +System.currentTimeMillis() + ".jpg";cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));return cameraIntent;}private Intent createCamcorderIntent() {return new Intent(MediaStore.ACTION_VIDEO_CAPTURE);}private Intent createSoundRecorderIntent() {return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);}
相关文章推荐
- android使用WebView来打开文件选择器(相机,相册,曲目)
- android使用WebView来打开文件选择器
- android中使用WebView来打开本机的文件选择器
- webview4.4以上版本使用loadurl加载过长js文件失效问题
- Android开发之如何在WebView中点击链接使用自身打开(解决出现的选择使用第三方应用的问题)
- android使用webView打开本地html文件
- android使用webview上传文件(支持相册和拍照)
- android使用webview上传文件(支持相册和拍照)
- [转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- Android通过WebView选择文件上传(支持直接调起相机等应用)
- android使用webview上传文件(支持相册和拍照)
- android使用webview上传文件(支持相册和拍照)
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- android webview页面中的文件(apk,mp3或mp4,以及文本等)链接,选择被打开还是直接下载
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本) .
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- Android:使用webview上传文件(支持相册和拍照) .
- Android使用webview加载网页,解决上传文件适配3.0、4.0、5.0手机存在的问题。