在Android中通过WebView调用相机拍照/选择文件
2015-12-30 17:31
411 查看
实现这种功能,都是在webview的WebChromeClient中覆盖掉openFileChooser方法,注意openFileChooser方法在WebChromeClient中有@hide标记。这里只管重写即可,下面将主要代码贴出来,做个记录
private ValueCallback mUploadFile;
/拍照/选择文件请求码*/
private static final int REQUEST_UPLOAD_FILE_CODE = 12343;
private void setWebChromeClient()
{
if (null != mMainWebView)
{
mMainWebView.setWebChromeClient(new WebChromeClient()
{
// Andorid 4.1+
public void openFileChooser(ValueCallback uploadFile, String acceptType, String capture)
{
openFileChooser(uploadFile);
}
这样就可以在WebView中上传文件了。记得要添加相应的权限!
参考:http://developer.android.com/about/versions/android-3.0.html
http://blog.sina.com.cn/s/blog_5749ead90101clrn.html
private ValueCallback mUploadFile;
/拍照/选择文件请求码*/
private static final int REQUEST_UPLOAD_FILE_CODE = 12343;
private void setWebChromeClient()
{
if (null != mMainWebView)
{
mMainWebView.setWebChromeClient(new WebChromeClient()
{
// Andorid 4.1+
public void openFileChooser(ValueCallback uploadFile, String acceptType, String capture)
{
openFileChooser(uploadFile);
}
// Andorid 3.0 + public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) { openFileChooser(uploadFile); } // Android 3.0 public void openFileChooser(ValueCallback<Uri> uploadFile) { // Toast.makeText(WebviewActivity.this, "上传文件/图片",Toast.LENGTH_SHORT).show(); mUploadFile = uploadFile; startActivityForResult(Intent.createChooser(createCameraIntent(), "Image Browser"), REQUEST_UPLOAD_FILE_CODE); } }); } } private Intent createCameraIntent() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//拍照 //======================================================= Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);//选择图片文件 imageIntent.setType("image/*"); //======================================================= return cameraIntent; } //最后在OnActivityResult中接受返回的结果 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_UPLOAD_FILE_CODE && resultCode == RESULT_OK) { if (null == mUploadFile) { return; } Uri result = (null == data) ? null : data.getData(); if (null != result) { ContentResolver resolver = this.getContentResolver(); String[] columns = { MediaStore.Images.Media.DATA }; Cursor cursor = resolver.query(result, columns, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(columns[0]); String imgPath = cursor.getString(columnIndex); System.out.println("imgPath = " + imgPath); if (null == imgPath) { return; } File file = new File(imgPath); //将图片处理成大小符合要求的文件 result = Uri.fromFile(handleFile(file)); mUploadFile.onReceiveValue(result); mUploadFile = null; } } super.onActivityResult(requestCode, resultCode, data); } /处理拍照/选择的文件*/ private File handleFile(File file) { DisplayMetrics dMetrics = getResources().getDisplayMetrics(); BitmapFactory.Options options = new Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(file.getAbsolutePath(), options); int imageWidth = options.outWidth; int imageHeight = options.outHeight; System.out.println(" imageWidth = " + imageWidth + " imageHeight = " + imageHeight); int widthSample = (int) (imageWidth / (dMetrics.density * 90)); int heightSample = (int) (imageHeight / (dMetrics.density * 90)); System.out.println("widthSample = " + widthSample + " heightSample = " + heightSample); options.inSampleSize = widthSample < heightSample ? heightSample : widthSample; options.inJustDecodeBounds = false; Bitmap newBitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options); System.out.println("newBitmap.size = " + newBitmap.getRowBytes() * newBitmap.getHeight()); File handleFile = new File(file.getParentFile(), "upload.png"); try { if (newBitmap.compress(CompressFormat.PNG, 50, new FileOutputStream(handleFile))) { System.out.println("保存图片成功"); } } catch (FileNotFoundException e) { e.printStackTrace(); } return handleFile; }
这样就可以在WebView中上传文件了。记得要添加相应的权限!
参考:http://developer.android.com/about/versions/android-3.0.html
http://blog.sina.com.cn/s/blog_5749ead90101clrn.html
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories