Android webview打开本地图片上传实现代码

发布时间 - 2026-01-10 23:08:05    点击率:

Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作。

直接上代码

package com.testandroid.webview;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebBackForwardList;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

import com.testandroid.R;

public class WebViewActivity extends AppCompatActivity { 

  private final String TAG = WebViewActivity.class.getSimpleName();

  private Button button;
  private WebView webView;

  private String recgPic = "http://m.shitu.chinaso.com/mx/index.html";

  public final static int FILECHOOSER_RESULTCODE = 1;
  public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);

    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      }
    });

    initTestWebView();

  }

  private void initTestWebView() {
    webView = (WebView) findViewById(R.id.tempWebView);

    WiewSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);

    webView.setWebChromeClient(new WebChromeClient() {
      @Override
      public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
        builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);
        builder.setCancelable(false);
        builder.setIcon(R.mipmap.ic_launcher);
        AlertDialog dialog = builder.create();
        dialog.show();
        result.confirm();
        return true;
      }

      //扩展浏览器上传文件
      //3.0++版本
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
        openFileChooserImpl(uploadMsg);
      }

      //3.0--版本
      public void openFileChooser(ValueCallback<Uri> uploadMsg) {
        openFileChooserImpl(uploadMsg);
      }

      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
        openFileChooserImpl(uploadMsg);
      }

      @Override
      public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        onenFileChooseImpleForAndroid(filePathCallback);
        return true;
      }
    });

    webView.setWebViewClient(new WebViewClient() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
      }
    });
    webView.loadUrl(recgPic);


  }

  public ValueCallback<Uri> mUploadMessage;
  private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("image/*");
    startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
  }

  public ValueCallback<Uri[]> mUploadMessageForAndroid5;
  private void onenFileChooseImpleForAndroid(ValueCallback<Uri[]> filePathCallback) {
    mUploadMessageForAndroid5 = filePathCallback;
    Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
    contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
    contentSelectionIntent.setType("image/*");

    Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
    chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
    chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");

    startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
  }

  @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;

    } else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5){
      if (null == mUploadMessageForAndroid5)
        return;
      Uri result = (intent == null || resultCode != RESULT_OK) ? null: intent.getData();
      if (result != null) {
        mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
      } else {
        mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
      }
      mUploadMessageForAndroid5 = null;
    }
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
      //获取历史列表
      WebBackForwardList mWebBackForwardList = webView
          .copyBackForwardList();
      //判断当前历史列表是否最顶端,其实canGoBack已经判断过
      if (mWebBackForwardList.getCurrentIndex() > 0) {
        webView.goBack();
        return true;
      }
    }
    return super.onKeyDown(keyCode, event);
  }
}

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


# android  # webview  # 图片上传  # Android开发实现webview中img标签加载本地图片的方法  # Android实现点击WebView界面中图片滑动浏览与保存图片功能  # Android 实现WebView点击图片查看大图列表及图片保存功能  # Android中WebView图片实现自适应的方法  # Android WebView中图片浏览及缩放效果  # 都能  # 大家多多  # 上传文件  # 终其  # 选择器  # 在各个  # index  # chinaso  # mx  # html  # FILECHOOSER_RESULTCODE  # static  # int  # TAG  # getSimpleName  # final  # String  # button  # http  # shitu 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Java垃圾回收器的方法和原理总结  JS弹性运动实现方法分析  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何使用Livewire构建动态组件?(入门代码)  韩国服务器如何优化跨境访问实现高效连接?  Laravel Fortify是什么,和Jetstream有什么关系  如何在IIS中新建站点并配置端口与物理路径?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  高端网站建设与定制开发一站式解决方案 中企动力  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  js实现点击每个li节点,都弹出其文本值及修改  黑客如何通过漏洞一步步攻陷网站服务器?  使用C语言编写圣诞表白程序  做企业网站制作流程,企业网站制作基本流程有哪些?  如何在云主机上快速搭建多站点网站?  浅谈Javascript中的Label语句  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  简历没回改:利用AI润色让你的文字更专业  深圳网站制作培训,深圳哪些招聘网站比较好?  Python文件操作最佳实践_稳定性说明【指导】  如何在万网自助建站中设置域名及备案?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  如何自定义建站之星模板颜色并下载新样式?  EditPlus中的正则表达式 实战(2)  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何使用withoutEvents方法临时禁用模型事件  利用vue写todolist单页应用  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何快速搭建高效香港服务器网站?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  长沙企业网站制作哪家好,长沙水业集团官方网站?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何使用Eloquent进行子查询  Laravel怎么为数据库表字段添加索引以优化查询  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框