Skip to content

App 内集成 H5 移动端 SDK 兼容性配置 ​

在移动应用(App)中集成金融级实人认证 H5 移动端 SDK 时,可能会因为内嵌浏览器(WebView)版本、内置权限等原因而无法兼容。本文旨在介绍如何在 App 配置 WebView 使用相机设备、允许网页视频播放等权限,以减少与 H5 移动端 SDK 兼容性问题。

Android 配置 ​

由于 Android 生态碎片化严重,App 内使用 Android 原生 Webview 调起系统摄像头可能存在一些兼容性问题,例如摄像头被拒绝,重新授权无法唤起刷脸页面等。以下是关于如何解决这些兼容性问题的步骤。

  1. 在 AndroidManifest.xml 文件声明以下权限。
xml
<!--应用访问相机权限。-->
<uses-permission android:name="android.permission.CAMERA" />
<!--应用访问网络权限。-->
<uses-permission android:name="android.permission.INTERNET" />
  1. 设置 Webview。

    1. 重写onPermissionRequest()方法,允许网页申请权限弹窗回调。

      对于基于 WebView 的网页应用,由于权限管理是由浏览器负责,用户访问 H5 网页调用摄像头时,如果用户拒绝了该权限请求,用户再次打开网页调用摄像头时,默认提示拒绝访问。因此您可以通过重写onPermissionRequest()方法,自定义处理网页权限请求。示例如下:

      webView.setWebChromeClient(new WebChromeClient(){
          @Override
          public void onPermissionRequest(PremissionRequest request) {
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  // 检查当前设备系统版本是否在Android 5.0及以上
                  // 如果是,则直接授予网页请求的所有权限。示例仅供参考,请根据实际情况重写。
                  request.grant(request.getResources());
              }
          }
      })
    2. 设置 WebView 允许网页视频自动播放。

      java
      // 允许自动播放
      webView.getSettings().setMediaPlaybackRequiresUserGesture(false);

iOS 配置 ​

  1. 在 Info.plist 中声明访问设备的摄像头权限。

    .NSCameraUsageDescription
  2. 设置 Webview。

    1. 通过WKWebViewConfiguration类配置允许使用相机。

      WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
      config.allowsInlineMediaPlayback = YES;
    2. 设置允许网页视频自动播放以及网页内播放。

      swift

    // 允许视频自动播放
    let myAudiovisualMediaType: WKAudiovisualMediaTypes = []
    config.mediaTypesRequiringUserActionForPlayback = myAudiovisualMediaType;
    
    // 允许视频在网页内播放(非全屏播放)
    config.allowsInlineMediaPlayback = true;

    Object C

    // 允许视频自动播放
    config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
    
    // 允许视频在网页内播放(非全屏播放)
    config.allowsInlineMediaPlayback = YES;

鸿蒙App配置 ​

  1. 在 module.json5 中声明访问设备的摄像头权限。
json
{
  "module": {
    "name": "entry",
    "type": "entry",
    "mainElement": "CameraWebViewPage",
    "deviceTypes": ["phone"],
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "exported": true,
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ]
      }
    ],
    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA",
        "reason": "用于网页调用摄像头"
      },
      {
        "name": "ohos.permission.INTERNET",
        "reason": "用于加载网页"
      }
    ]
  }
}
  1. 设置允许网页视频自动播放以及网页内播放。
dart
import { webview } from '@kit.ArkWeb';
import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct CameraWebViewPage {
  controller: webview.WebviewController = new webview.WebviewController();

  // 处理WebView权限请求
  handlePermissionRequest(event: webview.PermissionRequest) {
    console.info('权限请求资源:', event.request.getAccessibleResource());

    // 检查是否是摄像头权限
    const resources = event.request.getAccessibleResource();
    const isCameraRequest = resources.includes('camera') ||
                           resources.includes('Camera') ||
                           resources.some(res => res.toLowerCase().includes('camera'));

    // 弹出询问对话框
    promptAction.showDialog({
      title: '权限请求',
      message: isCameraRequest ?
        '网页请求使用摄像头进行活体检测,是否允许?' :
        '网页请求使用' + resources.join(',') + ',是否允许?',
      buttons: [
        {
          text: '拒绝',
          color: '#FF0000'
        },
        {
          text: '允许',
          color: '#007DFF'
        }
      ]
    }).then((result) => {
      console.info('用户选择:', result.index, result.text);

      if (result.index === 1) {
        // 用户点击"允许"
        event.request.grant(resources);
        promptAction.showToast({
          message: '已授权',
          duration: 2000
        });
      } else {
        // 用户点击"拒绝"或关闭弹窗
        event.request.deny();
        if (result.index === 0) {
          promptAction.showToast({
            message: '已拒绝',
            duration: 2000
          });
        }
      }
    }).catch((error) => {
      console.error('弹窗显示失败:', error);
      // 默认拒绝
      event.request.deny();
    });
  }

  build() {
    Column() {
      // 加载网页
      Web({
        src: '你的https网页地址',
        controller: this.controller
      })
      // 关键:监听权限请求并弹窗询问
      .onPermissionRequest((event) => {
        if (event) {
          console.info('收到权限请求事件');
          this.handlePermissionRequest(event);
        }
      })
      // 调试:打印H5控制台日志
      .onConsole((event) => {
        console.info('H5日志:', event.message);
      })
      // 必须启用JavaScript
      .javaScriptAccess(true)
      // 监听页面加载状态
      .onPageBegin(() => {
        console.info('页面开始加载');
      })
      .onPageEnd(() => {
        console.info('页面加载完成');
      })
      .width('100%')
      .height('100%')
    }
    .width('100%')
    .height('100%')
  }
}

2.问题反馈 ​

反馈问题时请附加页面截图/视频、请求入参回参等关键信息。