问题 QML WebView相机权限


我正在开发具有视频聊天功能的移动应用。我为webrtc找到了一个不错的javascript库,它似乎加载得很好 QWebView 但我需要允许它访问相机和麦克风,我无法弄清楚如何做到这一点。可能吗? QWebEngineView 有一个方便的信号和插槽,但它不支持移动。

清单权限不起作用,如上所述 这里

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

有任何想法吗?


11409
2018-05-16 05:52


起源

对于android,您只需将权限添加到AndroidManifest.xml - 详细信息 这里 - Skynet
@Derek,我很高兴知道,你找到了解决办法,因为我处于同样的境地。提前致谢。 - Deepak Patel


答案:


清单权限不适用于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级别来调用相同的行为。它也被描述 这里


5
2018-02-17 18:40



谢谢你的更新。以上答案是关于申请许可。我们的问题是w.r.t. WebView要求从js功能(Web内容)访问媒体。 Android Native java使用支持类'WebCromeClient'(android.webkit.WebChromeClient)来完成此操作。请查看我对Hubi的答案的评论。 - Swapnil


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

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

您必须使用的功能是:

  • 的checkPermission
  • requestPermissions
  • 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];
     }
}); 

5
2018-02-21 09:25



实际上,我们希望通知主机应用程序Web内容请求访问指定资源的权限并授予它。原生Android(java)'WebView'(android.webkit.WebView)使用'WebCromeClient'(android.webkit.WebChromeClient)提供此功能,并具有'onPermissionRequest()'函数,qt WebView是否具有类似功能。当Js功能要求媒体访问时。 - Swapnil
不是直接的,但也许这可以帮助: doc.qt.io/qt-5/qtwebchannel-index.html - Hubi


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

  1. 下载QT源代码。

  2. 更新代码 QtAndroidWebViewController.java。这个班级位于 〜/ QT / 5.10.0 / Src的/ qtwebview / SRC /罐/ SRC /组织/ qtproject / QT5 /机器人/视图。 将以下函数添加到内部类 QtAndroidWebChromeClient

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

  3. 根据您的Android sdk,您可能需要评论/更改 旧版Android的已弃用功能。你也可以改变 很少的方法 QtAndroidWebViewClient 根据新版本 Android系统。

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

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

  6. 替换路径中的罐子 〜/ QT / 5.10.0 / android_armv7 /罐/

  7. 现在重建(清理构建)您的原始项目,即使用WebView并且问题已解决。

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

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


2
2018-02-28 14:40