QML 网页视图相机权限



我正在开发一个具有视频聊天功能的移动应用程序。我为 webrtc 找到了一个不错的 javascript 库,它似乎在QWebView加载得很好,但我需要授予它访问摄像头和麦克风的权限,我不知道该怎么做。可能吗?QWebEngineView有一个方便的信号和插槽,但它不支持移动设备。

清单权限未按此处所述工作。

相应的Qt错误:无法使用QML WebView访问摄像头和麦克风

有什么想法吗?

Qt在5.10版本中实现了Android的权限模型。

看这里:http://doc.qt.io/qt-5/qtandroid.html。

您必须使用的功能包括:

  • 检查权限
  • 请求权限
  • 请求权限同步

如果要访问摄像头和麦克风,则必须在使用前请求权限。 例:

QStringList perms;
perms << "android.permission.CAMERA" << "android.permission.RECORD_AUDIO"; 
QtAndroid::checkPermissions(perms, [](const PermissionResultMap& resMap) {
foreach(const QString &key, resMap.keys()) {
qDebug() << "Result of permission" << key << ":" << resMap[key];
}
}); 

清单权限不适用于 Android 22>。因此,在您的情况下,您需要访问运行时权限。在 Java 中执行此操作。

if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
arrayOf(Manifest.permission.READ_CONTACTS),
MY_PERMISSIONS_REQUEST_READ_CONTACTS)
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}

参见官方文档。但是在您的情况下,我认为您需要通过 NDK 进行级别,以调用相同的行为。 这里也有描述。

我们通过重新编译 QT 代码并更新相应的 jar 来解决这个 QT 错误。我们使用维护工具下载了适用于安卓的QT源代码。在浏览QT源代码时,我们发现由于某种原因,Qt开发人员没有覆盖WebCromeClientonPermissionRequest(),因此WebView不允许媒体访问JS函数。请按照以下步骤解决问题。

  1. 下载QT源代码。

  2. 更新QtAndroidWebViewController.java中的代码。此类位于~/Qt/5.10.0/Src/qtwebview/src/jar/src/org/qtproject/qt5/android/view。 将以下函数添加到内部类QtAndroidWebChromeClient

    @Override public void onPermissionRequest(PermissionRequest request) { request.grant(request.getResources()); }

  3. 根据您的安卓SDK,您可能需要评论/更改 旧版安卓的已弃用函数。你也可以改变 根据新版本的QtAndroidWebViewClient中的一些方法 人造人。

  4. 然后导入项目 ~/Qt/5.10.0/Src/qtwebview 在你的Qt创建器中,你可能需要一些Java知识来解决问题(如果你遇到一些构建问题)

  5. 根据您的构建文件夹路径设置,成功的构建项目将在路径build_folder/jarQtAndroidWebView.jarQtAndroidWebView-bundled.jar中生成两个 jar

  6. 替换路径~/Qt/5.10.0/android_armv7/jar/中的 jar。

  7. 现在重建(干净构建)您的原始项目,该项目正在使用 WebView 并且问题已解决。

    注意:路径可能会根据QT下载路径和操作系统而变化,但构建的jar可以在任何系统上替换(作为java jar)。

    如果QT在下一版本中解决了这个问题,我们可以替换更新的jar。

最新更新