QML WebView 相机权限

11

我正在开发一个带有视频聊天功能的移动应用程序。我找到了一个很棒的webrtc的javascript库,它似乎可以在QWebView中正常加载,但我需要给它访问摄像头和麦克风的权限,我想不出如何做到这一点。这是可能的吗?QWebEngineView对于这个问题有一个方便的信号和插槽,但它不支持移动端。

清单权限没有按照这里所描述的那样工作。

相关的Qt bug:无法通过QML WebView访问相机和麦克风

有什么想法吗?


对于安卓系统,您可以将权限添加到 AndroidManifest.xml 中 - 详细信息在此处。[http://doc.qt.io/qtcreator/creator-deploying-android.html] - sknt
1
@ Derek,很高兴知道这个问题得到解决了,因为我也处于同样的情况。提前感谢您。 - Deepak Patel
3个回答

6

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

实际上,我们希望通知主机应用程序网页内容正在请求访问指定的资源并授予权限。本地Android(Java)的“WebView”(android.webkit.WebView)通过“WebCromeClient”(android.webkit.WebChromeClient)提供此功能,并具有函数“onPermissionRequest()”。Qt WebView是否具有类似的功能,当Js函数请求媒体访问时? - Swapnil
不是直接的,但或许这个可以帮助: http://doc.qt.io/qt-5/qtwebchannel-index.html - Hubi

5

在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获得级别,以调用相同的行为。这也在此处描述。


感谢更新。上面的答案是关于应用程序权限的。我们的问题与WebView有关,它要求从js函数(Web内容)中访问媒体。Android原生Java使用支持类'WebCromeClient'(android.webkit.WebChromeClient)来实现此功能。请查看我的评论以获取Hubi的答案。 - Swapnil

3
我们通过重新编译QT代码并更新相应的jars来解决了这个QT bug。我们使用维护工具下载了Android的QT源代码。在浏览QT源代码时,我们发现由于某种原因,QT开发人员没有覆盖WebCromeClient的onPermissionRequest()方法,导致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. 根据您的Android SDK版本,您可能需要注释/更改旧版Android的弃用功能。此外,根据新版本的Android,您可以更改QtAndroidWebViewClient中的一些方法。 4. 然后在Qt创建者中导入项目~/Qt/5.10.0/Src/qtwebview。如果遇到构建问题,则可能需要一些Java知识来解决问题。 5. 根据您的构建文件夹路径设置,成功构建项目将在路径build_folder/jar中生成两个jar:QtAndroidWebView.jar和QtAndroidWebView-bundled.jar。 6. 将jar替换为路径~/Qt/5.10.0/android_armv7/jar/中的jar。 7. 现在重新构建(清洁构建)您正在使用WebView的原始项目,问题已经解决。
注意:路径可能会根据QT下载路径和操作系统而更改,但生成的jar可以替换任何系统中的jar文件。如果QT在下一个版本中解决了此问题,我们可以替换更新的jar文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接