# ai-tongue-h5-android **Repository Path**: ai-tongue/ai-tongue-h5-android ## Basic Information - **Project Name**: ai-tongue-h5-android - **Description**: 中医舌诊H5集成示例(安卓版) - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 11 - **Forks**: 7 - **Created**: 2019-12-13 - **Last Updated**: 2025-08-28 ## Categories & Tags **Categories**: bio-medical **Tags**: None ## README # 中医舌诊H5集成使用示例 ## 介绍 * 此文档适用于安卓开发集成中医舌诊H5应用 * [点击进入官网](https://www.ai-tongue.com/) ## 常见问题 ### 1、中医AI舌诊页面点击上传舌象图片不能打开相册或相机。 #### 截图 #### 问题原因 1. webview不能让h5自己调用相册或相机。 #### 解决方法 1. 自行实现调用相册和相机 ``` /** * 不同手机相机相册兼容问题 */ webView.setWebChromeClient(new MyWebChromeClient()); /** * android webview 兼容相机相册选择 */ public class MyWebChromeClient extends WebChromeClient { // For Android >= 5.0 @Override public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { mUploadCallbackAboveL = filePathCallback; takePhoto(); return true; } // For Android < 3.0 public void openFileChooser(ValueCallback uploadMsg) { mUploadMessage = uploadMsg; takePhoto(); } // For Android >= 3.0 public void openFileChooser(ValueCallback uploadMsg, String acceptType) { mUploadMessage = uploadMsg; takePhoto(); } //For Android >= 4.1 public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; takePhoto(); } } /** * 上传图片 */ public void takePhoto() { //弹出提示框 new CommomDialog(this, new CommomDialog.CameraOpenListener() { @Override public void onClick(CommomDialog c) { checkCameraPermission(); c.dismiss(); } }, new CommomDialog.AblumOpenListener() { @Override public void onClick(CommomDialog c) { showAblum(); c.dismiss(); } }).show(); } /** * 调用相机权限控制 */ public void checkCameraPermission() { if (ContextCompat.checkSelfPermission(WebViewActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(WebViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申请WRITE_EXTERNAL_STORAGE权限 ActivityCompat.requestPermissions(WebViewActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE); } else { showCamera(); } } /** * 调用相机 */ public void showCamera() { File tempFile = new File(Environment.getExternalStorageDirectory(), "image.jpg"); imageUri = Uri.fromFile(tempFile); // 在官方7.0的以上的系统中,尝试传递 file://URI可能会触发FileUriExposedException if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { imageUri = FileProvider.getUriForFile(WebViewActivity.this, getPackageName() + ".fileProvider", tempFile);//通过FileProvider创建一个content类型的Uri } Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(openCameraIntent, REQ_CAMERA); } /** * 相册权限控制 */ public void checkAblumPermission() { if (ContextCompat.checkSelfPermission(WebViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申请WRITE_EXTERNAL_STORAGE权限 ActivityCompat.requestPermissions(WebViewActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, ABLUM_PERMISSIONS_REQUEST_CODE); } else { showAblum(); } } /** * 调用相册 */ public void showAblum() { Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT); openAlbumIntent.addCategory(Intent.CATEGORY_OPENABLE); openAlbumIntent.setType("image/*"); startActivityForResult(openAlbumIntent, REQ_CHOOSE); } /** * 权限处理回掉 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_PERMISSIONS_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //申请成功,可以拍照 showCamera(); } else { Toast.makeText(WebViewActivity.this, "你拒绝了权限,该功能不可用\n可在应用设置里授权拍照哦", Toast.LENGTH_SHORT).show(); } return; } if (requestCode == ABLUM_PERMISSIONS_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //申请成功 showAblum(); } else { Toast.makeText(WebViewActivity.this, "你拒绝了权限,该功能不可用\n可在应用设置里授权查看相册哦", Toast.LENGTH_SHORT).show(); } return; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQ_CHOOSE) { 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; } } else if (requestCode == REQ_CAMERA) { 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; } } else if (requestCode == SCAN_CODE) { if (data != null) { String arg = data.getStringExtra("result"); webView.loadUrl("javascript:receptionResult('" + arg + "')"); } } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) { 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[]{}; mUploadCallbackAboveL.onReceiveValue(results); mUploadCallbackAboveL = null; } return; } ``` ### 2、健康状态报告页面使用微信支付,提示错误“商家参数格式错误,请联系商家解决”。 #### 截图 #### 问题原因 1. 如果是APP里调起H5支付,需要在webview中手动设置referer,如(Map extraHeaders = new HashMap();extraHeaders.put("Referer", "商户申请H5时提交的授权域名"); //例如 http://www.baidu.com ))。 #### 解决方法 ``` /** * 微信支付跳转问题 */ webView.setWebViewClient(new WebViewClient() { String referer = "https://www.ai-tongue.com"; @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try { if (url.startsWith("weixin://") || url.startsWith("alipays://")) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); return true; } } catch (Exception e) { return false; } if (url.contains("https://wx.tenpay.com")) { Map extraHeaders = new HashMap<>(); extraHeaders.put("Referer", referer); view.loadUrl(url, extraHeaders); return true; } view.loadUrl(url); return true; } }); ```