适配h5中 < input file>调起相机和相册的功能代码:

private ValueCallback<Uri> uploadMessage;private ValueCallback<Uri[]> uploadMessageAboveL;private String mCurrentPhotoPath;private String mLastPhothPath;private Thread mThread;.......public class MyWebChromeClient extends WebChromeClient{@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsAlert: " + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsConfirm: " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result){Log.i(TAG, "onJsPrompt: " + message);return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic void onReceivedTitle(WebView view, String title){super.onReceivedTitle(view, title);}@Overridepublic void onProgressChanged(WebView view, int newProgress){if (newProgress == 100){progressBar.setVisibility(View.GONE);}else{if (progressBar.getVisibility() == View.GONE)progressBar.setVisibility(View.VISIBLE);progressBar.setProgress(newProgress);}super.onProgressChanged(view, newProgress);}//For Android  >= 5.0@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams){uploadMessageAboveL = filePathCallback;uploadPicture();return true;}//For Android  >= 4.1public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture){uploadMessage = valueCallback;uploadPicture();}}Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);takePhoto();}};@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode == REQUEST_CODE_ALBUM || requestCode == REQUEST_CODE_CAMERA){if (uploadMessage == null && uploadMessageAboveL == null){return;}//取消拍照或者图片选择时,返回null,否则<input file> 就是没有反应if (resultCode != RESULT_OK){if (uploadMessage != null){uploadMessage.onReceiveValue(null);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(null);uploadMessageAboveL = null;}}//拍照成功和选取照片时if (resultCode == RESULT_OK){Uri imageUri = null;switch (requestCode){case REQUEST_CODE_ALBUM:if (data != null){imageUri = data.getData();}break;case REQUEST_CODE_CAMERA:if (!TextUtils.isEmpty(mCurrentPhotoPath)){File file = new File(mCurrentPhotoPath);Uri localUri = Uri.fromFile(file);Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri);sendBroadcast(localIntent);imageUri = Uri.fromFile(file);mLastPhothPath = mCurrentPhotoPath;}break;}//上传文件if (uploadMessage != null){uploadMessage.onReceiveValue(imageUri);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(new Uri[]{imageUri});uploadMessageAboveL = null;}}}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (grantResults == null && grantResults.length == 0){return;}if (requestCode == REQUEST_CODE_PERMISSION_CAMERA){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){takePhoto();}else{// Permission Deniednew AlertDialog.Builder(mContext).setTitle("无法拍照").setMessage("您未授予拍照权限").setNegativeButton("取消", null).setPositiveButton("去设置", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", getPackageName(), null));startActivity(localIntent);}}).create().show();}}}/*** 选择相机或者相册*/public void uploadPicture(){AlertDialog.Builder builder = new AlertDialog.Builder(WebviewForNursingActivity.this);builder.setTitle("请选择图片上传方式");//取消对话框builder.setOnCancelListener(new DialogInterface.OnCancelListener(){@Overridepublic void onCancel(DialogInterface dialog){//一定要返回null,否则<input type='file'>if (uploadMessage != null){uploadMessage.onReceiveValue(null);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(null);uploadMessageAboveL = null;}}});builder.setPositiveButton("相机", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){if (!TextUtils.isEmpty(mLastPhothPath)){//上一张拍照的图片删除mThread = new Thread(new Runnable(){@Overridepublic void run(){File file = new File(mLastPhothPath);if (file != null){file.delete();}mHandler.sendEmptyMessage(1);}});mThread.start();}else{//请求拍照权限if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){takePhoto();}else{ActivityCompat.requestPermissions(WebviewForNursingActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_PERMISSION_CAMERA);}}}});builder.setNegativeButton("相册", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){chooseAlbumPic();}});builder.create().show();}/*** 拍照*/private void takePhoto(){StringBuilder fileName = new StringBuilder();Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);fileName.append(UUID.randomUUID()).append("_upload.jpg");File tempFile = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName.toString());if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri uri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileprovider", tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}else{Uri uri = Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}mCurrentPhotoPath = tempFile.getAbsolutePath();startActivityForResult(intent, REQUEST_CODE_CAMERA);}/*** 选择相册照片*/private void chooseAlbumPic(){Intent i = new Intent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType("image/*");startActivityForResult(Intent.createChooser(i, "Image Chooser"), REQUEST_CODE_ALBUM);}

Android-解决Webview对选择文件 点击无响应

但是这种方法,用相机拍照,传递两张照片,有时候会有异常,可以使用下边的代码

 private ValueCallback<Uri[]> mUploadCallback;private Uri imageUri;private int PHOTO_REQUEST_CODE = 1111;...public class MyWebChromeClient extends WebChromeClient{@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsAlert: " + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsConfirm: " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result){Log.i(TAG, "onJsPrompt: " + message);return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic void onReceivedTitle(WebView view, String title){super.onReceivedTitle(view, title);}@Overridepublic void onProgressChanged(WebView view, int newProgress){if (newProgress == 100){progressBar.setVisibility(View.GONE);}else{if (progressBar.getVisibility() == View.GONE)progressBar.setVisibility(View.VISIBLE);progressBar.setProgress(newProgress);}super.onProgressChanged(view, newProgress);}//For Android  >= 5.0@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams){mUploadCallback = filePathCallback;takePhoto();return true;}}Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);takePhoto();}};@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode == PHOTO_REQUEST_CODE){if (mUploadCallback != null){choosePic(resultCode, data);}else{Toast.makeText(this, "发生错误", Toast.LENGTH_SHORT).show();}}}/*** 拍照或相册*/private void takePhoto(){String filePath = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES + File.separator;String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";imageUri = Uri.fromFile(new File(filePath + fileName));Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);Intent Photo = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);Intent chooserIntent = Intent.createChooser(Photo, "Image Chooser");chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});startActivityForResult(chooserIntent, PHOTO_REQUEST_CODE);}private void choosePic(int resultCode, Intent data){if (RESULT_OK == resultCode){updatePhotos();if (data != null){Uri[] results;Uri uriData = data.getData();if (uriData != null){results = new Uri[]{uriData};mUploadCallback.onReceiveValue(results);}else if (imageUri != null){mUploadCallback.onReceiveValue(new Uri[]{imageUri});}else{mUploadCallback.onReceiveValue(null);}}else{mUploadCallback.onReceiveValue(new Uri[]{imageUri});}}else{mUploadCallback.onReceiveValue(null);}mUploadCallback = null;}//更新照片private void updatePhotos(){Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);intent.setData(imageUri);sendBroadcast(intent);}

小米部分机型,调起系统相册没反应的解决办法
小米的部分机型,点击相册,没反应,直接resultCode 0,解决办法:
将MIUI优化关闭,重启手机后,打开APP

app开发中无法调起MIUI系统相册拾取图片

android h5 input file 的适配和小米手机调起系统相册无效的Bug相关推荐

  1. 小米2怎样启动ANdroid?,小米手机怎么开双系统?小米手机双系统开启使用教程

    小米手机的MIUI系统作为国产安卓定制系统,一直受到米粉的热捧,以超高的个性化和实用性广受好评.升级MIUI8之后,小米手机提供了一种双系统的玩法,在一台手机上,两个系统,随时切换,保护自己的隐私,那 ...

  2. 小米用上鸿蒙系统,红米小米手机刷新了鸿蒙系统后还能用吗 红米小米手机刷鸿蒙系统图文攻略...

    鸿蒙系统是华为新上线的系统.除了华为,不少其他品牌机型的网友也想使用,红米小米手机可以使用鸿蒙系统吗?下面一起来看看如何操作吧. [红米小米手机刷新了鸿蒙系统后还能用吗] 目前来说小米.红米手机还不能 ...

  3. 小米手机ADB删除系统应用去广告

    小米手机ADB删除系统应用去广告 前言 1.准备 2.进入开发者模式 3.连接手机与电脑 4.使用ADB命令删除系统应用 前言 本文要介绍的方法可以免 root 卸载预置应用,仅删除当前用户下的 AP ...

  4. 小米android 7 分屏,官方确认!小米手机分屏功能7月上线:支持多款机型

    今天下午的新品发布会,小米发布了第二代大屏续航手机小米Max 2,采用6.44英寸大屏.5300mAh容量电池(支持给其它设备充电),主摄像头使用了和小米6一样的索尼IM386传感器.售价方面,,4G ...

  5. 小米刷机android正在启动,刷机不怕变砖 小米手机MIUI双系统详解

    前面都是些理论,实际操作是怎么样的呢?在进行切换系统的时候也有两种方式,第一种非常简单,在系统升级界面下按菜单键,选择切换系统,点击确定后重启手机就会自动切换到另外一个系统. 从上面的视频中可以看到, ...

  6. android mmi 删除后自动回复,教大家小米手机自动恢复删除的信息怎么办

    近日有关于小米手机自动恢复删除的信息怎么办的问题受到了很多网友们的关注,大多数网友都想要知道小米手机自动恢复删除的信息怎么办的具体情况,那么关于到小米手机自动恢复删除的信息怎么办的相关信息,小编也是在 ...

  7. android 360 ppi,360特供 vs 小米手机性能大比拼!

    标签:小米手机(89) 盛夏来临,与炎热的天气保持同样热度的,是360即将发售的特供手机.6月12日,360第二款特供机AK47(阿卡47)揭开面纱,凭借高配置和1699元的低价格,吸引了足够的眼球. ...

  8. 【历史上的今天】8 月 16 日:Debian 诞生;小米手机及 MIUI 系统发布!

    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来.在科技历史中的 8 月 16 日,都有哪些关键事件发生呢? 1993 年 8 月 16 日,Ian Murdock 首次发表 Debian L ...

  9. adb shell 小米手机_小米手机ADB删除系统应用去广告

    adb shell pm uninstall --user 0 com.miui.systemAdSolution(小米系统广告解决方案,必删) adb shell pm uninstall --us ...

最新文章

  1. Javascript 装饰器极速指南
  2. Android Service完全解析,关于服务你所需知道的一切(下)
  3. NYOJ 115 城市平乱
  4. 响应信息不明确的接口做关联
  5. burp suite 二级域名扫描插件
  6. 【牛客 - 368B】选点(dfs序,LIS 或 dfs序 + 树状数组 + 离散化,树状数组求LIS的方法)
  7. 李炎恢老师Dreamweaver视频课程(53课时)[已完结]
  8. 电热耦合_作者特稿︱电网运行环境下基于电热耦合潮流的架空线路应力预估
  9. Jquery选择器大全汇总
  10. Hyper-V 3.0网络虚拟化PART 3:内部交换机
  11. 投资中的黑科技知多少?
  12. 现代通信原理5.1:信号的希尔伯特变换
  13. 腾讯低代码平台正式开源:可拖拽生成手机、PC等项目-接私活福利啊
  14. 涉密打印机与设密计算机之间采用,涉密打印机与涉密计算机之间 - 作业在线问答...
  15. An exception was thrown while activating xxxxController
  16. 2016年下半年信息安全工程师上午选择题及解析
  17. 计网实验七:应用层协议服务配置(DNS,HTTP,FTP)
  18. 2019高中数学联赛备考手册(预赛试题集锦)
  19. 【Spark】Spark电商数据分析
  20. 使用ShareSDK进行第三方(登录,分享)

热门文章

  1. rt1052 linux手册,【正点原子号令者RT1052使用】8.RT1052之USMART调试组件
  2. 联科教育为全球最大的网络供应商Cisco(思科)提供技术培训!
  3. linux自定义安装docker版本
  4. 百度小程序页面基础信息配置文档
  5. 以垄断打压对手,联发科涉嫌触犯《反垄断法》
  6. Amdroid ExpandableListView(可折叠列表)的基本使用
  7. springboot sqlite 的疑难解决:The database disk image is malformed
  8. 8虚拟机字节码执行引擎
  9. visio 2010里面形状的剪切、联合、组合、拆分、相交、剪除功能在这里
  10. python取整的几种方法,Python中取整的几种方法小结