Android中的webview支持页面中的文件上传实例代码

Android webview在默认情况下是不支持网页中的文件上传功能的;

如果在网页中有<input type="file" />,在android webview中访问时也会出现浏览文件的按钮

但是点击按钮之后没有反应...

那么如何能够让android的webview能够响应,这个浏览按钮呢?在网上查了很多资料,很多相同的,但都漏掉了一个地方,导致无法读取到文件的完整地址(“c:\upfile\233232.jpg”),整理最终代码入下:

我们需要为webview设置WebChromeClient,在WebChromeClient的实现类中覆盖文件选择的方法:

package com.example.webviewupfile; 

import java.io.File;
import java.io.IOException; 

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar; 

public class MainActivity extends Activity {
  private ValueCallback<Uri> mUploadMessage;
  private final static int FILECHOOSER_RESULTCODE = 1;
  private WebView web;
  private ProgressBar progressBar; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    web = (WebView) findViewById(R.id.webView1);
    progressBar = (ProgressBar) findViewById(R.id.progressBar1); 

    web = new WebView(this);
    web.getSettings().setJavaScriptEnabled(true);
    web.loadUrl("http://ueditor.baidu.com/website/onlinedemo.html");
    web.setWebViewClient(new myWebClient());
    web.setWebChromeClient(new WebChromeClient() {
      // The undocumented magic method override
      // Eclipse will swear at you if you try to put @Override here
      // For Android 3.0+
      public void openFileChooser(ValueCallback<Uri> uploadMsg) { 

        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        MainActivity.this.startActivityForResult(
            Intent.createChooser(i, "File Chooser"),
            FILECHOOSER_RESULTCODE); 

      } 

      // For Android 3.0+
      public void openFileChooser(ValueCallback uploadMsg,
          String acceptType) {
        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("*/*");
        MainActivity.this.startActivityForResult(
            Intent.createChooser(i, "File Browser"),
            FILECHOOSER_RESULTCODE);
      } 

      // For Android 4.1
      public void openFileChooser(ValueCallback<Uri> uploadMsg,
          String acceptType, String capture) {
        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        MainActivity.this.startActivityForResult(
            Intent.createChooser(i, "File Chooser"),
            MainActivity.FILECHOOSER_RESULTCODE); 

      } 

    }); 

    setContentView(web);
  } 

  @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;
      Bitmap bm = null;
      //外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
      ContentResolver resolver = getContentResolver();
      try {
        Uri originalUri = intent.getData(); // 获得图片的uri
        bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
        // 这里开始的第二部分,获取图片的路径:
        String[] proj = { MediaStore.Images.Media.DATA };
        // 好像是android多媒体数据库的封装接口,具体的看Android文档
        Cursor cursor = managedQuery(originalUri, proj, null, null,
            null);
        // 按我个人理解 这个是获得用户选择的图片的索引值
        int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        // 将光标移至开头 ,这个很重要,不小心很容易引起越界
        cursor.moveToFirst();
        // 最后根据索引值获取图片路径 

        String path = cursor.getString(column_index);
        Uri uri = Uri.fromFile(new File(path));
        mUploadMessage.onReceiveValue(uri);
      } catch (IOException e) { 

        Log.e("TAG-->Error", e.toString()); 

      }
    }
  } 

  public class myWebClient extends WebViewClient {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
      // TODO Auto-generated method stub
      super.onPageStarted(view, url, favicon);
    } 

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      // TODO Auto-generated method stub 

      view.loadUrl(url);
      return true; 

    } 

    @Override
    public void onPageFinished(WebView view, String url) {
      // TODO Auto-generated method stub
      super.onPageFinished(view, url); 

      progressBar.setVisibility(View.GONE);
    }
  } 

  // flipscreen not loading again
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  } 

  // To handle "Back" key press event for WebView to go back to previous
  // screen.
  /*
   * @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if
   * ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack();
   * return true; } return super.onKeyDown(keyCode, event); }
   */
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈关于Android WebView上传文件的解决方案

    我们在开发需求的时候,难免会接入一下第三方的H5页面,有些H5页面是具有上传照片的功能,Android 中的 WebView是不能直接打开文件选择弹框的 接下来我讲简单提供一下解决方案,先说一下思路 1.接收WebView打开文件选择器的通知 2.收到通知后,打开文件选择器等待用户选择需要上传的文件 3.在onActivityResult中得到用户选择的文件的Uri 4.然后把Uri传递给Html5 这样就完成了一次H5选择文件的过程,下面我把代码贴出来自习看一下 首先,WebView必须要支持

  • Android 解决WebView无法上传文件的问题

    Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

  • Android WebView那些坑之上传文件示例

    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片. 解决问题之前我们先来说说WebView上传文件的逻辑:当我们在Web页面上点击选择文件的控件(<input type="file">)时,会回调WebChromeClient下的openFileChooser()(5.0及以上系统回调onShowFileChooser()).这个时候我们在openFileChooser方法中通过Intent打开系统相册或

  • Android WebView 上传文件支持全解析

    默认情况下情况下,使用Android的WebView是不能够支持上传文件的.而这个,也是在我们的前端工程师告知之后才了解的.因为Android的每个版本WebView的实现有差异,因此需要对不同版本去适配.花了一点时间,参考别人的代码,这个问题已经解决,这里把我踩过的坑分享出来. 主要思路是重写WebChromeClient,然后在WebViewActivity中接收选择到的文件Uri,传给页面去上传就可以了. 创建一个WebViewActivity的内部类 public class XHSWe

  • Android Volley扩展实现支持进度条的文件上传功能

    volley是一个轻量级的开源网络通信框架,开源的好处就是可以自由定制自己需要的jar包.volley里网络通信时android2.3以上用的HttpUrlConnection,2.3以下用的HttpClient,我做的改动只考虑了2.3以上,不支持2.3版本以下.HttpUrlConnection默认传输数据是将数据全部写到内存中再发送到服务端,Volley就是采用默认的方式,这样在上传大文件时很容易就out of memory,有一种解决办法是设置每次传输流的大小: 已知文件大小:conne

  • Android中的webview支持页面中的文件上传实例代码

    Android webview在默认情况下是不支持网页中的文件上传功能的: 如果在网页中有<input type="file" />,在android webview中访问时也会出现浏览文件的按钮 但是点击按钮之后没有反应... 那么如何能够让android的webview能够响应,这个浏览按钮呢?在网上查了很多资料,很多相同的,但都漏掉了一个地方,导致无法读取到文件的完整地址("c:\upfile\233232.jpg"),整理最终代码入下: 我们需要

  • php中通过Ajax如何实现异步文件上传的代码实例

    1:取得file对象 2:读取2进制数据 3:模拟http请求,把数据发送出去(这里通常比较麻烦) 在forefox下使用 xmlhttprequest 对象的 sendasbinary 方法发送数据: 4:完美实现 遇到的问题 目前仅有 firefox 可以正确上传文件.(chrome也可以采google.gears上传) 对于从firefox和chrome下读取到的文件数据好像不一样(不知道是否是调试工具的原因) chrome以及其他高级浏览器没有 sendasbinary 方法 只能使用

  • Java中使用内存映射实现大文件上传实例

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验. 复制代码 代码如下: package test; import java.io.BufferedInputStream;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import

  • Python爬虫中Selenium实现文件上传

    前言:大部分的文件上传功能都是用input标签实现,这样就完全可以把它看作一个输入框,可以通过send_keys()指定文件进行上传了. 本章中用到的关键方法如下: send_keys():上传文件或者输入文本 from selenium import webdriver import time driver = webdriver.Chrome() driver.get('http://file.yiyuen.com/file/') # 定位上传按钮,添加本地文件 driver.find_el

  • JavaEE中struts2实现文件上传下载功能实例解析

    本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

  • PHP中,文件上传

    在PHP中,文件上传一般是通过move_uploaded_file()来实现的.  bool move_uploaded_file ( string filename, string destination )本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的).如果文件合法,则将其移动为由 destination 指定的文件. 如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_fil

  • Android基于OkHttp实现文件上传功能

    本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一.相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而可以参照web端的数据传输形式来实现. multipart/form-data是浏览器提交表单上传文件的一种方式. 有关于http的get,post请求大家可以自行百度了解. OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZI

  • Android编程使WebView支持HTML5 Video全屏播放的解决方法

    本文实例讲述了Android编程使WebView支持HTML5 Video全屏播放的解决方法.分享给大家供大家参考,具体如下: 1)需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做,具体如下: a. 如果要声明整个应用都要加速: 复制代码 代码如下: <application ... android:hardwareAccelerated ="tr

  • Android从网络中获得一张图片并显示在屏幕上的实例详解

    Android从网络中获得一张图片并显示在屏幕上的实例详解 看下实现效果图: 1:androidmanifest.xml的内容 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.capinftotech.image" an

随机推荐