Разрешение камеры 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 разрешает эту проблему в следующей версии, мы можем заменить обновленные банки.