欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android WebView调用本地相册的方法

程序员文章站 2023-08-31 14:08:07
本文实例为大家分享了android webview调用本地相册的具体实现方法,供大家参考,具体内容如下 首先要知道android本身的webview是并不支持调用手机...

本文实例为大家分享了android webview调用本地相册的具体实现方法,供大家参考,具体内容如下

首先要知道android本身的webview是并不支持调用手机文件并上传的,其次webview的内核在android每次更新的时候都是不太一样的,也是够坑爹的;不过需求又不能改,h5需要调用系统相册,还好最后还是找到方法解决了,就是要重写里面的一个方法,不过这种情况也是在5.0之前有效,5.0之后就需要重写另外的一个方法,先将这些方法一个个的列出
注意在这里我们需要重写的方法是在这个webchromeclient类里面的;

private valuecallback<uri> muploadmessage;
private valuecallback<uri[]> muploadcallbackabovel;
private final static int filechooser_resultcode = 101;

当我们是5.0以下的话,用的是以下三个方法:

public void openfilechooser(valuecallback<uri> uploadmsg) {
  log.d(tag, "openfilechoose(valuecallback<uri> uploadmsg)");
  muploadmessage = uploadmsg;
  intent i = new intent(intent.action_get_content);
  i.addcategory(intent.category_openable);
  i.settype("image/*");
  html5activity.this.startactivityforresult(intent.createchooser(i, "file chooser"),
      filechooser_resultcode);
}
public void openfilechooser(valuecallback uploadmsg, string accepttype) {
  log.d(tag, "openfilechoose( valuecallback uploadmsg, string accepttype )");
  muploadmessage = uploadmsg;
  intent i = new intent(intent.action_get_content);
  i.addcategory(intent.category_openable);
  i.settype("image/*");
  html5activity.this.startactivityforresult(
      intent.createchooser(i, "file browser"),
      filechooser_resultcode);
}
public void openfilechooser(valuecallback<uri> uploadmsg, string accepttype, string capture) {
  log.d(tag, "openfilechoose(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/*");
  html5activity.this.startactivityforresult(intent.createchooser(i, "file browser"),
      filechooser_resultcode);
}

值得注意的是这三种方法都是一样的,只是在不同版本下会分别调用,还有就是这个方法是重写这个webchromeclient类里面的,别以为是我们随便写的,只是google不希望我们重写这个方法罢了,不过5.0之后就又不一样了,需要重写的是下面的这个方法:

@override
public boolean onshowfilechooser(webview webview, valuecallback<uri[]> filepathcallback, filechooserparams filechooserparams) {
  muploadcallbackabovel = filepathcallback;
  intent i = new intent(intent.action_get_content);
  i.addcategory(intent.category_openable);
  i.settype("image/*");
  html5activity.this.startactivityforresult(
      intent.createchooser(i, "file browser"),
      filechooser_resultcode);
  return true;
}

好了,到了这一步我们的调用已经ok了,但还有一个需要的过程;跟我们普通的回调接收是一模一样的:

@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
  super.onactivityresult(requestcode, resultcode, data);
  if (requestcode == filechooser_resultcode) {
    if (null == muploadmessage && null == muploadcallbackabovel) return;
    uri result = data == null || resultcode != result_ok ? null : data.getdata();
    if (muploadcallbackabovel != null) {
      onactivityresultabovel(requestcode, resultcode, data);
    } else if (muploadmessage != null) {
      muploadmessage.onreceivevalue(result);
      muploadmessage = null;
    }
  }
}

当然还有一个是让我们在5.0的情况下用的:

private void onactivityresultabovel(int requestcode, int resultcode, intent data) {
  if (requestcode != filechooser_resultcode
      || muploadcallbackabovel == null) {
    return;
  }
  uri[] results = null;
  if (resultcode == activity.result_ok) {
    if (data == null) {
    } else {
      string datastring = data.getdatastring();
      clipdata clipdata = data.getclipdata();
      if (clipdata != null) {
        results = new uri[clipdata.getitemcount()];
        for (int i = 0; i < clipdata.getitemcount(); i++) {
          clipdata.item item = clipdata.getitemat(i);
          results[i] = item.geturi();
          log.e(tag, "onactivityresultabovel: " + results[i].getpath());
        }
      }
      if (datastring != null)
        results = new uri[]{uri.parse(datastring)};
      log.e(tag, "onactivityresultabovel: " + results.length);
    }
  }
  muploadcallbackabovel.onreceivevalue(results);
  muploadcallbackabovel = null;
  return;
}

到这一步h5基本就可以正常的调用手机的相册了。

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