Android Разрешения WebView для API UserMedia и Geolocation никогда не разрешаются - PullRequest
0 голосов
/ 17 января 2020

Я создаю 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 и, да, я предоставил приложению разрешения Камера и Местоположение с помощью переключателей в Настройках.

...