html能调用 webview调用相册,WebView如何调用系统的相机和相册上传文件-程序员宅基地

技术标签: html能调用 webview调用相册  

private ValueCallback mUploadMessage;// 表单的数据信息

private ValueCallback mUploadCallbackAboveL;

private final static int FILECHOOSER_RESULTCODE = 1;// 表单的结果回调

private Uri imageUri;

/**

* web视图

*/

mWebView.setWebChromeClient(new WebChromeClient() {

//设置网页加载的进度条

@Override

public void onProgressChanged(WebView view, int newProgress) {

super.onProgressChanged(view, newProgress);

if (newProgress == 100) {

mProgressBar.setVisibility(View.GONE);

} else {

mProgressBar.setVisibility(View.VISIBLE);

mProgressBar.setProgress(newProgress);

}

}

//android>5.0调用这个方法

@Override

public boolean onShowFileChooser(WebView webView,

ValueCallback filePathCallback,

FileChooserParams fileChooserParams) {

mUploadCallbackAboveL=filePathCallback;

take();

return true;

}

public void openFileChooser(ValueCallback uploadMsg) {

mUploadMessage=uploadMsg;

take();

}

public void openFileChooser(ValueCallback uploadMsg,String acceptType) {

mUploadMessage=uploadMsg;

take();

}

public void openFileChooser(ValueCallback uploadMsg,String acceptType, String capture) {

mUploadMessage=uploadMsg;

take();

}

});

if (!TextUtils.isEmpty(mWebUrl)) {

mBrowserLayout.loadUrl(mWebUrl);

} else {

Toast.makeText(this, "获取URL地址失败", Toast.LENGTH_SHORT).show();

}

}

@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) {

Log.e("result",result+"");

if(result==null){

// mUploadMessage.onReceiveValue(imageUri);

mUploadMessage.onReceiveValue(imageUri);

mUploadMessage = null;

Log.e("imageUri",imageUri+"");

}else {

mUploadMessage.onReceiveValue(result);

mUploadMessage = null;

}

}

}

}

@SuppressWarnings("null")

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

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) {

results = new Uri[]{imageUri};

} 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();

}

}

if (dataString != null)

results = new Uri[]{Uri.parse(dataString)};

}

}

if(results!=null){

mUploadCallbackAboveL.onReceiveValue(results);

mUploadCallbackAboveL = null;

}else{

results = new Uri[]{imageUri};

mUploadCallbackAboveL.onReceiveValue(results);

mUploadCallbackAboveL = null;

}

return;

}

private void take(){

File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");

// Create the storage directory if it does not exist

if (! imageStorageDir.exists()){

imageStorageDir.mkdirs();

}

File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");

imageUri = Uri.fromFile(file);

final List cameraIntents = new ArrayList();

final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

final PackageManager packageManager = getPackageManager();

final List listCam = packageManager.queryIntentActivities(captureIntent, 0);

for(ResolveInfo res : listCam) {

final String packageName = res.activityInfo.packageName;

final Intent i = new Intent(captureIntent);

i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

i.setPackage(packageName);

i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

cameraIntents.add(i);

}

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

Intent chooserIntent = Intent.createChooser(i,"Image Chooser");

chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));

ServiceWebActivity.this.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39678493/article/details/117893909

智能推荐

Android中UI线程与子线程的通信_android ui线程 向子线程 通信-程序员宅基地

文章浏览阅读224次。在UI线程中定义并使用handler消息机制可以有效的帮助与其他线程的通信private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case SUCCESS_NUMBER:_android ui线程 向子线程 通信

Keil MDK526 相同变量 突出显示_keil5如何点亮同名变量-程序员宅基地

文章浏览阅读3.7w次,点赞31次,收藏49次。十一放假回家,突然想用keil编个程序,家里电脑没有安装keil,于是在keil官网下载了5.26版本,又在其他网站下载了keygen,安装之后发现keil有个新的功能,就是光标点到C代码某个变量时,其他位置的这个变量也会突出显示,以前用VS2008上位机时的Visual Assist X插件就比较方便,这是很久之前就想要的功能啊。于是回到公司后,就下载了一个5.26直接安装,发现没有突出显示,把..._keil5如何点亮同名变量

Flask-SQLAlchemy 的基本使用_flask sqlalchemy的基本使用 juejin-程序员宅基地

文章浏览阅读338次。SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。安装安装 flask-sqlalchemypip install flask-sqlalchemy如果连接的是 mysql 数据库,需要安装 mysqldbpip install flask-..._flask sqlalchemy的基本使用 juejin

解决后端返回json数据给前端显示乱码问题_javaweb:后端返回的json子串在前端乱码-程序员宅基地

文章浏览阅读4k次。1.问题:问题代码:出问题的问题代码:package com.example.demo;import com.example.Bean.Student;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestCon..._javaweb:后端返回的json子串在前端乱码

shell判断是否有root权限_[error] this script must be run as root!-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏2次。root_need() { if [[ $EUID -ne 0 ]]; then echo "Error:This script must be run as root!" 1>&2 exit 1 fi}_[error] this script must be run as root!

netty-socketio 概述-程序员宅基地

文章浏览阅读484次。netty-socketio 概述netty-socketio是一个开源的Socket.io服务器端的一个java的实现,它基于Netty框架,可用于服务端推送消息给客户端。说到服务端推送技术,一般会涉及WebSocket,WebSocket是HTML5最新提出的规范,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况,为了兼容所有浏览器,给程序员提供一致的编程体验,SocketIO..._netty-socketio public

随便推点

ftp 只需上传禁止下载-程序员宅基地

文章浏览阅读2k次。一、首先在ftp / 主目录下给所有用户授予读写权限二、给子目录授予写入权限,不允许读取转载于:https://www.cnblogs.com/tengfei520/p/7563259.html_xftp禁用下载

有关Qt显示图片的问题_qt设计师frame怎么设置1然后固定图片的输出-程序员宅基地

文章浏览阅读476次。有关Qt显示图片的问题问题描述解决过程解决办法参考博客问题描述想设置图片随着Qt界面的变化而改变大小解决过程Qt显示设置成固定大小问题:看起来很别扭将最大化和最小化分别设定一个固定值问题:随意改变大小的时候比较难受,在最大化时,由于固定值过大,无法最小化继续查找解决方案,最后得到办法解决办法下面4步在qt Designer中完成1.让显示图片的QLable的所在的框中使用网格布局,布局中的其他空间可以固定大小;2.让显示在QLabel中的内容居中显示(Alignment的Cent_qt设计师frame怎么设置1然后固定图片的输出

英文SEO外部链接资源收集之常用的footprints-程序员宅基地

文章浏览阅读10w+次。inurl:/privacy-policy "Using Article Directory plugin"inurl:/terms "Using Article Directory plugin""There are * published articles and * registered authors"inurl:submitgui..._footprint seo

代理的三种方式_代理方式的资料-程序员宅基地

文章浏览阅读957次。代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。举例:明星(XXX)---经纪人用户 目标 (代理)_代理方式的资料

解决搭载M1芯片的Mac上安装犀牛Rhinoceros 7 for Mac的安装教程_犀牛7软件mac免费安装教程-程序员宅基地

文章浏览阅读4.2k次,点赞10次,收藏8次。解决苹果搭载M1芯片的Mac上安装犀牛Rhinoceros 7 for Mac的安装教程本次教程演示版本:犀牛Rhinoceros 7 for Mac 7.3目前很多网友反应苹果最新搭载M1芯片处理器的Mac上安装传统版本犀牛都运行失败和闪退,经过小编近段时间的摸索,大部分都是不兼容M1和big sur系统导致的,根据M1处理器和BIG sur对应的兼容性,特此分享M1处理器安装7.3版本犀牛的安装方法和版本,还有遇到权限问题的解决方法!有需要的小伙伴千万不要错过哦在Rhinoceros Mac 特_犀牛7软件mac免费安装教程

vue组件封装共用的组件_vue 多个组件共享了相同的prototype-程序员宅基地

文章浏览阅读3.7k次,点赞5次,收藏13次。这里提供两种vue封装共用组件的方法方法一:main.js中import ListItem from './components/list.vue'//封装共用组件方法一Vue.component('ListItem',ListItem)方法二:新建vue文件的时候再建个相应的js文件。component.jsimport child from './compon..._vue 多个组件共享了相同的prototype

推荐文章

热门文章

相关标签