使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限

Posted

技术标签:

【中文标题】使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限【英文标题】:Auto Grant access to Mic and Camera with Qt WebEngine 【发布时间】:2018-03-16 03:33:02 【问题描述】:

我正在使用 RPi 和 WebRTC 构建家庭安全系统。我只需要一种方法来触发浏览器在给定的 URL 处打开并自动授予对麦克风和摄像头的访问权限。我曾希望将 WebEngine 库与 PyQt 一起使用,但用于 RPi 的 PyQt 不支持 WebEngine。所以我现在正在尝试 Qt 本身。不幸的是我不熟悉C++,所以我很挣扎。

示例here 有我需要的 90%。代码复制如下。我只需要调整它以在请求时授予对麦克风和摄像头的访问权限。我希望有人可以帮助我吗?

#include <QApplication>
#include <QWebEngineView>

QUrl commandLineUrlArgument()

    const QStringList args = QCoreApplication::arguments();
    for (const QString &arg : args.mid(1)) 
        if (!arg.startsWith(QLatin1Char('-')))
            return QUrl::fromUserInput(arg);
    
    return QUrl(QStringLiteral("https://www.qt.io"));



int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QWebEngineView view;
    view.setUrl(commandLineUrlArgument());
    view.resize(1024, 750);
    view.show();

    return app.exec();

【问题讨论】:

【参考方案1】:

我回答了这个问题,但是对于 PyQt5:Grant access to Cam & Mic using Python for PyQt WebEngine,我只会做一个 C++ 到 Python 的翻译,基础是一样的。

#include <QApplication>
#include <QUrl>
#include <QWebEngineView>

class WebEnginePage: public QWebEnginePage
    Q_OBJECT
public:
    WebEnginePage(QObject *parent = Q_NULLPTR):QWebEnginePage(parent)
        connect(this, &WebEnginePage::featurePermissionRequested, this, &WebEnginePage::onFeaturePermissionRequested);
    
private Q_SLOTS:
    void onFeaturePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature)

        if(feature  == QWebEnginePage::MediaAudioCapture
                || feature == QWebEnginePage::MediaVideoCapture
                || feature == QWebEnginePage::MediaAudioVideoCapture)
            setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
        else
            setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
    
;

QUrl commandLineUrlArgument()

    const QStringList args = QCoreApplication::arguments();
    for (const QString &arg : args.mid(1)) 
        if (!arg.startsWith(QLatin1Char('-')))
            return QUrl::fromUserInput(arg);
    
    return QUrl(QStringLiteral("https://www.qt.io"));



int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QWebEngineView view;
    view.setPage(new WebEnginePage);
    view.setUrl(commandLineUrlArgument());
    view.resize(1024, 750);
    view.show();

    return app.exec();


#include "main.moc"

【讨论】:

在创建信号和插槽时,Qt 创建处理这些连接的 moc 文件,当您创建 .ui 时,这些文件是自动创建的,但在 main.cpp 的情况下,您必须手动包含它,这就是为什么我有要在示例中执行此操作,请检查 http://doc.qt.io/qt-5/moc.html @LeeMelbourne 如果我的回答对您有帮助,请将其标记为正确。 非常感谢。当我运行发布的代码时,我得到“main.moc 没有这样的文件或目录”。如果我删除该行,我会得到“未定义的对 webenginepage 的 vtable 的引用”。你能帮忙解决我可能做错的事情吗? @LeeMelbourne 在 Qt Creator 中转到 build 选项卡并按 run qmake 选项。 太棒了!效果很好。不幸的是,当我访问诸如 meet.jit.si 或 append.in 之类的网站时,他们仍然提示使用 cam 和 mic。但我认为这来自他们的 Web 应用程序层,而不是来自浏览器。我不打算在 Pi 上使用 UI,所以我需要解决这个问题。

以上是关于使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

Yocto SDK,QtWebEngine:QT 中的未知模块:webengine

项目错误:QT 中的未知模块:webengine

Qt5.9.1 和 Visual Studio 2015 添加 Qt WebEngine 模块

Qt5.9 WebEngine 概述

用于 javascript 的 QT 5.4 WebEngine 开发工具

Qt WebEngine 未在 Ubuntu 14.04 上与 Qt 5.12 链接