在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器 - CSDN博客

来源: 在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

赞(1) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册