Я создаю Android приложение, которое имеет относительно простую задачу преобразования удаленного веб-приложения в WebView
. Сайт обслуживается по протоколу HTTPS и использует getUserMedia()
(только для камеры) и API геолокации.
Я могу отобразить сайт в пределах WebView
; Однако пользовательские медиа и геолокационные аспекты не работают.
Из различных похожих постов на этом сайте я получил следующий код:
AndroidManifest. xml
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
MainActivity. java
public final void webview() {
WebView webview = new WebView(this);
WebSettings webviews = webview.getSettings();
webviews.setDomStorageEnabled(true);
webviews.setGeolocationEnabled(true);
webviews.setJavaScriptEnabled(true);
webviews.setJavaScriptCanOpenWindowsAutomatically(true);
webviews.setMediaPlaybackRequiresUserGesture(false);
webview.setWebViewClient(new android.webkit.WebViewClient());
webview.setWebChromeClient(new android.webkit.WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(
final String origin,
final GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
@Override
public void onPermissionRequest(final PermissionRequest request) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
request.grant(request.getResources());
}
});
}
});
webview.loadUrl("https://RETRACTED");
setContentView(webview);
}
Что происходит
Насколько я могу скажите, это работает. Веб-приложение изящно обрабатывает сценарий, когда оно не может получить разрешения камеры / местоположения, поэтому я знаю, когда они недоступны. Похоже, что веб-приложение постоянно ожидает предоставления / отклонения разрешений, что никогда не завершается. Из журналов отладки в onPermissionRequest()
я вижу, что это вызывается.
Используя приведенный выше код, когда я go на экране камеры в приложении, элемент video отображает значок воспроизведения WebKit заполнитель на несколько мгновений, который затем исчезает. Фид видео никогда не появляется. Аналогично, геолокация никогда не достигается (и я не вижу, чтобы значок местоположения появлялся в строке состояния Android). Само собой разумеется, что все работает при установке в качестве PWA из Chrome.
Удаление реализации onPermissionRequest()
дает ожидаемые результаты - веб-приложение продолжает работать в режиме «недоступности камеры».
Я сейчас в растерянности относительно того, как действовать дальше. Кажется, я исчерпал похожие темы в этой топике c, и могло бы показаться, что приложение (Android) получает запросы на разрешение и предоставляет их. Однако содержимое WebView, кажется, никогда не узнает об этом.
Я тестирую приложение на Android 9.0 и, да, я предоставил приложению разрешения Камера и Местоположение с помощью переключателей в Настройках.