我正在开发一个具有视频聊天功能的移动应用程序。我为 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开发人员没有覆盖WebCromeClient
的onPermissionRequest()
,因此WebView不允许媒体访问JS函数。请按照以下步骤解决问题。
-
下载QT源代码。
-
更新
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()); }
-
根据您的安卓SDK,您可能需要评论/更改 旧版安卓的已弃用函数。你也可以改变 根据新版本的
QtAndroidWebViewClient
中的一些方法 人造人。 -
然后导入项目 ~/Qt/5.10.0/Src/qtwebview 在你的Qt创建器中,你可能需要一些Java知识来解决问题(如果你遇到一些构建问题)
-
根据您的构建文件夹路径设置,成功的构建项目将在路径build_folder/jar
。QtAndroidWebView.jar
、QtAndroidWebView-bundled.jar
中生成两个 jar -
替换路径~/Qt/5.10.0/android_armv7/jar/中的 jar。
-
现在重建(干净构建)您的原始项目,该项目正在使用 WebView 并且问题已解决。
注意:路径可能会根据QT下载路径和操作系统而变化,但构建的jar可以在任何系统上替换(作为java jar)。
如果QT在下一版本中解决了这个问题,我们可以替换更新的jar。