【问题标题】:QML WebView Camera PermissionQML WebView 摄像头权限
【发布时间】:2017-10-15 01:29:07
【问题描述】:

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

清单权限未按here 所述工作。

对应的Qt bug:cant access camera and mic with QML WebView

有什么想法吗?

【问题讨论】:

  • 对于android,您只需将权限添加到AndroidManifest.xml - 详情here
  • @Derek,我很高兴知道,您是否找到了解决方案,因为我处于同样的情况。提前致谢。

标签: android qt qml webrtc qwebview


【解决方案1】:

清单权限不适用于 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.
    }
}

Official Doc。但在你的情况下,我认为你需要通过 NDK 来调用相同的行为。它也被描述为here

【讨论】:

  • 感谢更新。以上答案是关于申请许可的。我们的问题是w.r.t。 WebView 从 js 函数(Web 内容)请求媒体访问。 Android Native java 使用支持类“WebCromeClient”(android.webkit.WebChromeClient)来做到这一点。请查看我对 Hubi 答案的评论。
【解决方案2】:

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

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

你必须使用的功能是:

  • 检查权限
  • 请求权限
  • requestPermissionsSync

如果您想访问摄像头和麦克风,您必须在使用前申请权限。 示例:

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

【讨论】:

  • 其实我们是想通知宿主应用程序网页内容正在请求访问指定资源的权限并授予它。 Native Android(java)'WebView'(android.webkit.WebView)使用'WebCromeClient'(android.webkit.WebChromeClient)提供此功能并具有功能'onPermissionRequest()',qt WebView是否具有类似功能。当 Js 函数请求媒体访问时。
  • 不是直接的,但也许这会有所帮助:doc.qt.io/qt-5/qtwebchannel-index.html
【解决方案3】:

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

  1. 下载QT源码。

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

    @覆盖 公共无效 onPermissionRequest(PermissionRequest 请求){ request.grant(request.getResources()); }

  3. 根据您的 Android sdk,您可能需要注释/更改 旧版本 Android 的已弃用功能。你也可以改变 根据新版本的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 在下一个版本中解决了这个问题,我们可以替换更新的 jars。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2011-03-12
    • 2021-08-06
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多