Разрешение камеры QML WebView

Я работаю над мобильным приложением, в котором есть функция видеочата. Я нашел хорошую библиотеку javascript для webrtc, которая, похоже, очень хорошо загружается в QWebView, но мне нужно дать ей разрешение на доступ к камере и микрофону, и я не могу понять, как это сделать. Является ли это возможным? QWebEngineView имеет для этого удобный сигнал и слот, но он не поддерживается для мобильных устройств.

Разрешения манифеста не работают, как описано здесь.

Соответствующая ошибка Qt: камера доступа и микрофон с QML WebView

Любые идеи?

Ответ 1

Qt реализовала модель разрешений Android в версии 5.10.

Смотрите здесь: 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];
     }
}); 

Ответ 2

Разрешение на манифест не работает для 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 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, чтобы вызвать такое же поведение. Он также описал здесь.

Ответ 3

Мы решили эту ошибку QT, перекомпилировав QT-код и обновив соответствующие банки. Мы загрузили исходный код QT для Android с помощью инструмента "Техобслуживание". Просматривая исходный код QT, мы обнаружили, что по какой-то причине разработчики Qt не переопределяют onPermissionRequest() of WebCromeClient, из-за чего WebView не разрешает Media доступ к функциям 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.grant(request.getResources()); }

  • В зависимости от вашего Android-устройства sdk вам может потребоваться Комментировать/Изменить устаревшие функции для старых версий Android. Также вы можете изменить несколько методов из QtAndroidWebViewClient в соответствии с новыми версиями Android.

  • Затем импортируйте проект ~/Qt/5.10.0/Src/qtwebview. В своем создателе Qt вам могут потребоваться некоторые знания Java для решения проблем (если вы получаете некоторые проблемы с сборкой)

  • В зависимости от пути пути к папке сборки, успешный проект сборки будет генерировать две банки в пути build_folder/jar QtAndroidWebView.jar, QtAndroidWebView-bundled.jar.

  • Замените банки в пути ~/Qt/5.10.0/android_armv7/jar/.

  • Теперь перестройте (Clean build) исходный проект, использующий WebView, и проблема будет решена.

    Примечание. Путь может меняться в зависимости от пути загрузки QT и операционной системы, но встроенная банка может быть заменена на любой системе (в виде java-банок).

    Если QT разрешает эту проблему в следующей версии, мы можем заменить обновленные банки.