android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)
来源:互联网 发布:拳击实战知乎 编辑:程序博客网 时间:2024/06/03 14:14
首先学习 http://blog.csdn.net/woshinia/article/details/19030437 对input file的支持
1.注意
2.上面的参考由于比较老,不适用于安卓5.0系统,因为谷歌5.0以后对webkit做了改动,
相关API发生了变化,那么5.0的需要参考http://blog.csdn.net/earbao/article/details/50716747
汇总改进后得出我写的:(最高6.0的安卓系统都支持,已测试使用)
1.注意
mUploadMessage.onReceiveValue(Uri.parse(""));必须得到调用,无论用户是否选了图,否则会出现再点击不响应的情况
2.上面的参考由于比较老,不适用于安卓5.0系统,因为谷歌5.0以后对webkit做了改动,
相关API发生了变化,那么5.0的需要参考http://blog.csdn.net/earbao/article/details/50716747
汇总改进后得出我写的:(最高6.0的安卓系统都支持,已测试使用)
package com.fuiou.webviewupload;import java.io.File;import java.io.IOException;import android.app.Activity;import android.app.AlertDialog;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import android.view.KeyEvent;import android.webkit.ValueCallback;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends Activity { public static final String TAG = "MainActivity"; ValueCallback<Uri> mUploadMessage; ValueCallback<Uri[]> mFilePathCallback; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mWebView = (WebView) findViewById(R.id.web_view); mWebView.setWebChromeClient(new MyWebChromeClient()); mWebView.setWebViewClient(new MyWebViewClient(this));// webView.loadUrl("file:///android_asset/upload_image.html"); mWebView.loadUrl("http://192.168.25.38:8001/test/2016/5/2016-5-24/index.html"); } private class MyWebViewClient extends WebViewClient{ private Context mContext; public MyWebViewClient(Context context){ super(); mContext = context; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d(TAG,"URL地址:" + url); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Log.i(TAG, "onPageFinished"); super.onPageFinished(view, url); } } public static final int FILECHOOSER_RESULTCODE = 1; private static final int REQ_CAMERA = FILECHOOSER_RESULTCODE+1; private static final int REQ_CHOOSE = REQ_CAMERA+1; private class MyWebChromeClient extends WebChromeClient { public boolean onShowFileChooser( WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { if (mFilePathCallback != null) return true; mFilePathCallback = filePathCallback; selectImage(); return true; } // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; selectImage();// Intent i = new Intent(Intent.ACTION_GET_CONTENT);// i.addCategory(Intent.CATEGORY_OPENABLE);// i.setType("*/*");// startActivityForResult( Intent.createChooser( i, "File Chooser" ), 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); } } /** * 检查SD卡是否存在 * * @return */ public final boolean checkSDcard() { boolean flag = Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); if (!flag) { Toast.makeText(this, "请插入手机存储卡再使用本功能",Toast.LENGTH_SHORT).show(); } return flag; } String compressPath = ""; protected final void selectImage() { if (!checkSDcard()) return; String[] selectPicTypeStr = { "camera","photo" }; AlertDialog alertDialog = new AlertDialog.Builder(this) .setItems(selectPicTypeStr, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { // 相机拍摄 case 0: openCarcme(); break; // 手机相册 case 1: chosePic(); break; default: break; } compressPath = Environment .getExternalStorageDirectory() .getPath() + "/fuiou_wmp/temp"; new File(compressPath).mkdirs(); compressPath = compressPath + File.separator + "compress.jpg"; } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { if(mFilePathCallback != null){ Uri[] uris = new Uri[1]; uris[0] = Uri.parse(""); mFilePathCallback.onReceiveValue(uris); mFilePathCallback=null; }else { mUploadMessage.onReceiveValue(Uri.parse("")); mUploadMessage=null; } } }).show(); } String imagePaths; Uri cameraUri; /** * 打开照相机 */ private void openCarcme() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imagePaths = Environment.getExternalStorageDirectory().getPath() + "/fuiou_wmp/temp/" + (System.currentTimeMillis() + ".jpg"); // 必须确保文件夹路径存在,否则拍照后无法完成回调 File vFile = new File(imagePaths); if (!vFile.exists()) { File vDirPath = vFile.getParentFile(); vDirPath.mkdirs(); } else { if (vFile.exists()) { vFile.delete(); } } cameraUri = Uri.fromFile(vFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); startActivityForResult(intent, REQ_CAMERA); } /** * 拍照结束后 */ private void afterOpenCamera() { File f = new File(imagePaths); addImageGallery(f); } /** 解决拍照后在相册中找不到的问题 */ private void addImageGallery(File file) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } /** * 本地相册选择图片 */ private void chosePic() { FileUtils.delFile(compressPath); Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT" String IMAGE_UNSPECIFIED = "image/*"; innerIntent.setType(IMAGE_UNSPECIFIED); // 查看类型 Intent wrapperIntent = Intent.createChooser(innerIntent, null); startActivityForResult(wrapperIntent, REQ_CHOOSE); } /** * 选择照片后结束 * * @param data */ private Uri afterChosePic(Intent data) { // 获取图片的路径: String[] proj = { MediaStore.Images.Media.DATA }; // 好像是android多媒体数据库的封装接口,具体的看Android文档 Cursor cursor = managedQuery(data.getData(), proj, null, null, null); if(cursor == null ){ Toast.makeText(this, "上传的图片仅支持png或jpg格式",Toast.LENGTH_SHORT).show(); return null; } // 按我个人理解 这个是获得用户选择的图片的索引值 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); // 将光标移至开头 ,这个很重要,不小心很容易引起越界 cursor.moveToFirst(); // 最后根据索引值获取图片路径 String path = cursor.getString(column_index); if(path != null && (path.endsWith(".png")||path.endsWith(".PNG")||path.endsWith(".jpg")||path.endsWith(".JPG"))){ File newFile = FileUtils.compressFile(path, compressPath); return Uri.fromFile(newFile); }else{ Toast.makeText(this, "上传的图片仅支持png或jpg格式",Toast.LENGTH_SHORT).show(); } return null; } /** * 返回文件选择 */ @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;// } if (null == mUploadMessage || mFilePathCallback == null) return; Uri uri = null; File file = new File(cameraUri.getPath()); if(!file.exists()){ cameraUri = Uri.parse(""); } if(requestCode == REQ_CAMERA ){ afterOpenCamera(); uri = cameraUri; }else if(requestCode == REQ_CHOOSE){ uri = afterChosePic(intent); } if(mFilePathCallback != null){ Uri[] uris = new Uri[1]; uris[0] = uri; mFilePathCallback.onReceiveValue(uris); }else { mUploadMessage.onReceiveValue(uri); } mFilePathCallback = null; mUploadMessage = null; super.onActivityResult(requestCode, resultCode, intent); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; }else{ finish(); } return super.onKeyDown(keyCode, event); }}
0 2
- android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)
- android使用webview上传文件(支持相册和拍照)
- android使用webview上传文件(支持相册和拍照)
- android使用webview上传文件(支持相册和拍照)
- android使用webview上传文件(支持相册和拍照)
- Android:使用webview上传文件(支持相册和拍照) .
- android使用webview上传文件(支持相册和拍照)
- android 支持WebView上传文件
- Android webview支持type="file" 打开相机和相册,支持小米(亲测6.0通过)
- Android的webView支持文件上传
- Android webview支持页面中的文件上传
- Android WebView 上传文件支持全解析
- Android WebView 选择图片并上传(调用相机拍照/相册/选择文件)
- android项目从零开始 Android webview支持 文件上传、图片上传
- # 仿照微信类的图片上传,支持相册及拍照
- WebView中调用系统相册或拍照上传
- android webview使用html5<input id="input" type="file"/> 上传相册、拍照照片
- Android 使用腾讯X5 Webview浏览器拍照或从相册上传图片
- vim的最最最基本操作
- 基于nodejs微信支付
- ASP.NET C# MVC 初学(一)
- fragment嵌套fragment,支持点击、滑动变换页面效果
- java中File类的使用方法
- android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)
- eclipse 到处javadoc出现字符编码问题解决
- IQView关键测试项简介
- QT QString 十六进制整数变为字符串自动补0 && 十进制补零
- jar
- linux mysql操作指令
- Ubuntu15.10 Hadoop伪分布式环境安装
- javascript中遍历EL表达式List集合中的值
- 禁止选择文本的兼容写法