来源: 在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器 – CSDN博客
最近做的一个项目中,有这样一个要求,在浏览器中调用系统的拍照功能或者选择文件,然后将文件上传到服务器,类似修改头像。 简单而言,就是在一个html页面中有这样一段代码 <input class=”filePrew” type=”file” capture=”camera” accept=”image/*” name=”image”>
刚开始的时候,没有感觉很难的,因为在UC浏览器、系统自带的浏览器中都可以进行拍照/文件管理器选择,可是在自己所写的Activity中却不行。后来实在是没有思路了,就在网上找了一下,发现要 实现这种功能,都是在webview的WebChromeClient中覆盖掉openFileChooser方法,注意openFileChooser方法在WebChromeClient中有@hide标记。这里只管重写即可,下面将主要代码贴出来,做个记录
<span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ValueCallback</span><span class = "pun" ><</span><span class = "typ" >Uri</span><span class = "pun" >></span><span class = "pln" > mUploadFile</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /**拍照/选择文件请求码*/ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > REQUEST_UPLOAD_FILE_CODE </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" > 12343 </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setWebChromeClient</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > mMainWebView</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > mMainWebView</span><span class = "pun" >.</span><span class = "pln" >setWebChromeClient</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >WebChromeClient</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > // Andorid 4.1+ </span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > openFileChooser</span><span class = "pun" >(</span><span class = "typ" >ValueCallback</span><span class = "pun" ><</span><span class = "typ" >Uri</span><span class = "pun" >></span><span class = "pln" > uploadFile</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > acceptType</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > capture</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > openFileChooser</span><span class = "pun" >(</span><span class = "pln" >uploadFile</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > // Andorid 3.0 + </span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > openFileChooser</span><span class = "pun" >(</span><span class = "typ" >ValueCallback</span><span class = "pun" ><</span><span class = "typ" >Uri</span><span class = "pun" >></span><span class = "pln" > uploadFile</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > acceptType</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > openFileChooser</span><span class = "pun" >(</span><span class = "pln" >uploadFile</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > // Android 3.0 </span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > openFileChooser</span><span class = "pun" >(</span><span class = "typ" >ValueCallback</span><span class = "pun" ><</span><span class = "typ" >Uri</span><span class = "pun" >></span><span class = "pln" > uploadFile</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > // Toast.makeText(WebviewActivity.this, "上传文件/图片",Toast.LENGTH_SHORT).show(); </span><span class="pln"> mUploadFile </span><span class = "pun" >=</span><span class = "pln" > uploadFile</span><span class = "pun" >;</span><span class = "pln" > startActivityForResult</span><span class = "pun" >(</span><span class = "typ" >Intent</span><span class = "pun" >.</span><span class = "pln" >createChooser</span><span class = "pun" >(</span><span class = "pln" >createCameraIntent</span><span class = "pun" >(),</span><span class = "pln" > </span><span class = "str" > "Image Browser" </span><span class = "pun" >),</span><span class = "pln" > REQUEST_UPLOAD_FILE_CODE</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pln" > createCameraIntent</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pln" > cameraIntent </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pun" >(</span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "pln" >ACTION_IMAGE_CAPTURE</span><span class = "pun" >);</span><span class = "com" > //拍照 </span><span class="pln"> </span><span class = "com" > //======================================================= </span><span class="pln"> </span><span class = "typ" >Intent</span><span class = "pln" > imageIntent </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pun" >(</span><span class = "typ" >Intent</span><span class = "pun" >.</span><span class = "pln" >ACTION_GET_CONTENT</span><span class = "pun" >);</span><span class = "com" > //选择图片文件 </span><span class="pln"> imageIntent</span><span class = "pun" >.</span><span class = "pln" >setType</span><span class = "pun" >(</span><span class = "str" > "image/*" </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //======================================================= </span><span class="pln"> </span><span class = "kwd" > return </span><span class = "pln" > cameraIntent</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > //最后在OnActivityResult中接受返回的结果 </span><span class="pln"> </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onActivityResult</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > requestCode</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > resultCode</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pln" > data</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >requestCode </span><span class = "pun" >==</span><span class = "pln" > REQUEST_UPLOAD_FILE_CODE </span><span class = "pun" >&&</span><span class = "pln" > resultCode </span><span class = "pun" >==</span><span class = "pln" > RESULT_OK</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > mUploadFile</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "typ" >Uri</span><span class = "pln" > result </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > data</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >?</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >:</span><span class = "pln" > data</span><span class = "pun" >.</span><span class = "pln" >getData</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > result</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ContentResolver</span><span class = "pln" > resolver </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >getContentResolver</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pun" >[]</span><span class = "pln" > columns </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >DATA </span><span class = "pun" >};</span><span class = "pln" > </span><span class = "typ" >Cursor</span><span class = "pln" > cursor </span><span class = "pun" >=</span><span class = "pln" > resolver</span><span class = "pun" >.</span><span class = "pln" >query</span><span class = "pun" >(</span><span class = "pln" >result</span><span class = "pun" >,</span><span class = "pln" > columns</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > cursor</span><span class = "pun" >.</span><span class = "pln" >moveToFirst</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > columnIndex </span><span class = "pun" >=</span><span class = "pln" > cursor</span><span class = "pun" >.</span><span class = "pln" >getColumnIndex</span><span class = "pun" >(</span><span class = "pln" >columns</span><span class = "pun" >[</span><span class = "lit" > 0 </span><span class = "pun" >]);</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > imgPath </span><span class = "pun" >=</span><span class = "pln" > cursor</span><span class = "pun" >.</span><span class = "pln" >getString</span><span class = "pun" >(</span><span class = "pln" >columnIndex</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "kwd" >out</span><span class = "pun" >.</span><span class = "pln" >println</span><span class = "pun" >(</span><span class = "str" > "imgPath = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > imgPath</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > imgPath</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pln" > file </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pun" >(</span><span class = "pln" >imgPath</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //将图片处理成大小符合要求的文件 </span><span class="pln"> result </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >Uri</span><span class = "pun" >.</span><span class = "pln" >fromFile</span><span class = "pun" >(</span><span class = "pln" >handleFile</span><span class = "pun" >(</span><span class = "pln" >file</span><span class = "pun" >));</span><span class = "pln" > mUploadFile</span><span class = "pun" >.</span><span class = "pln" >onReceiveValue</span><span class = "pun" >(</span><span class = "pln" >result</span><span class = "pun" >);</span><span class = "pln" > mUploadFile </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onActivityResult</span><span class = "pun" >(</span><span class = "pln" >requestCode</span><span class = "pun" >,</span><span class = "pln" > resultCode</span><span class = "pun" >,</span><span class = "pln" > data</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /**处理拍照/选择的文件*/ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pln" > handleFile</span><span class = "pun" >(</span><span class = "typ" >File</span><span class = "pln" > file</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >DisplayMetrics</span><span class = "pln" > dMetrics </span><span class = "pun" >=</span><span class = "pln" > getResources</span><span class = "pun" >().</span><span class = "pln" >getDisplayMetrics</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "typ" >Options</span><span class = "pln" > options </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Options</span><span class = "pun" >();</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >inJustDecodeBounds </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > true </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "pln" >decodeFile</span><span class = "pun" >(</span><span class = "pln" >file</span><span class = "pun" >.</span><span class = "pln" >getAbsolutePath</span><span class = "pun" >(),</span><span class = "pln" > options</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > imageWidth </span><span class = "pun" >=</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >outWidth</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > imageHeight </span><span class = "pun" >=</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >outHeight</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "kwd" >out</span><span class = "pun" >.</span><span class = "pln" >println</span><span class = "pun" >(</span><span class = "str" > " imageWidth = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > imageWidth </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "str" > " imageHeight = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > imageHeight</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > widthSample </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >imageWidth </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >dMetrics</span><span class = "pun" >.</span><span class = "pln" >density </span><span class = "pun" >*</span><span class = "pln" > </span><span class = "lit" > 90 </span><span class = "pun" >));</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > heightSample </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >imageHeight </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >dMetrics</span><span class = "pun" >.</span><span class = "pln" >density </span><span class = "pun" >*</span><span class = "pln" > </span><span class = "lit" > 90 </span><span class = "pun" >));</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "kwd" >out</span><span class = "pun" >.</span><span class = "pln" >println</span><span class = "pun" >(</span><span class = "str" > "widthSample = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > widthSample </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "str" > " heightSample = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > heightSample</span><span class = "pun" >);</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >inSampleSize </span><span class = "pun" >=</span><span class = "pln" > widthSample </span><span class = "pun" ><</span><span class = "pln" > heightSample </span><span class = "pun" >?</span><span class = "pln" > heightSample </span><span class = "pun" >:</span><span class = "pln" > widthSample</span><span class = "pun" >;</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >inJustDecodeBounds </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > false </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > newBitmap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "pln" >decodeFile</span><span class = "pun" >(</span><span class = "pln" >file</span><span class = "pun" >.</span><span class = "pln" >getAbsolutePath</span><span class = "pun" >(),</span><span class = "pln" > options</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "kwd" >out</span><span class = "pun" >.</span><span class = "pln" >println</span><span class = "pun" >(</span><span class = "str" > "newBitmap.size = " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > newBitmap</span><span class = "pun" >.</span><span class = "pln" >getRowBytes</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" > newBitmap</span><span class = "pun" >.</span><span class = "pln" >getHeight</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pln" > handleFile </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pun" >(</span><span class = "pln" >file</span><span class = "pun" >.</span><span class = "pln" >getParentFile</span><span class = "pun" >(),</span><span class = "pln" > </span><span class = "str" > "upload.png" </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > try </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >newBitmap</span><span class = "pun" >.</span><span class = "pln" >compress</span><span class = "pun" >(</span><span class = "typ" >CompressFormat</span><span class = "pun" >.</span><span class = "pln" >PNG</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 50 </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >FileOutputStream</span><span class = "pun" >(</span><span class = "pln" >handleFile</span><span class = "pun" >)))</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "kwd" >out</span><span class = "pun" >.</span><span class = "pln" >println</span><span class = "pun" >(</span><span class = "str" > "保存图片成功" </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > catch </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >FileNotFoundException</span><span class = "pln" > e</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > e</span><span class = "pun" >.</span><span class = "pln" >printStackTrace</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > handleFile</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
这样就可以在WebView中上传文件了。记得要添加相应的权限!
参考:http://developer.Android.com/about/versions/Android-3.0.html
http://blog.sina.com.cn/s/blog_5749ead90101clrn.html