Проблема с предоставлением разрешений в приложении WebView + webRT C в Android - PullRequest
2 голосов
/ 24 января 2020

Проблема появилась в моем WebView после обновления Chrome до 79 вер. 2019.12.18 в Android устройстве. Мой WebView перестал запрашивать разрешение на доступ к камере и микрофону, хотя в ранних версиях Chrome (56, 78) это работало. Я использую этот поставщик webRT C: https://trueconf.ru/. Я получаю эту ошибку в своих журналах каждые 15 секунд:

E/chromium: [ERROR:web_contents_delegate.cc(218)] WebContentsDelegate::CheckMediaAccessPermission: Not supported.

Если я пытаюсь открыть webRT C -сессию в Chrome, это работает. Так что, я думаю, есть некоторое расхождение между Chrome и хромом, или что-то в этом роде. Я создал небольшое приложение, которое эмулирует мой исходный код:

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private static final int RC_CAMERA_AND_VOICE = 1;
    private static final int RC_CAMERA_AND_CAMERA = 2;
    private static final int RC_CAMERA_AND_CAPTURE = 3;


    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkPermissions();
    }

    private void checkPermissions() {

        Log.e("VideoChat", "checkPermissions");


        if ((ContextCompat.checkSelfPermission(
                this.getApplication(), 
                Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) &&
                (ContextCompat.checkSelfPermission(this.getApplication(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED)) {

            requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},0);
        } else {
            this.startWebView();
        }


    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        }
        this.startWebView();
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void startWebView() {
        webView = findViewById(R.id.web_view);

        webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                Log.e("VideoChat", "onPermissionRequest");
                request.grant(request.getResources());
            }

        });

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptThirdPartyCookies(webView, true);

        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.getSettings().setAllowFileAccessFromFileURLs(true);
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSaveFormData(true);
        webView.getSettings().setSupportZoom(false);
        webView.getSettings().setDomStorageEnabled(true);

        webView.loadUrl("https://your.webrtc.provider");
    }
}

Мой манифест. xml:

<uses-permission android:name="android.webkit.PermissionRequest" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
    <uses-permission android:name="android.permission.WRITE_LOCAL_STORAGE" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
    <uses-permission
        android:name="android.permission.MODIFY_AUDIO_SETTINGS"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
    <uses-permission
        android:name="android.permission.RECORD_AUDIO"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
    <uses-permission
        android:name="android.permission.CAMERA"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
    <uses-permission
        android:name="android.permission.CAPTURE_VIDEO_OUTPUT"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
    <uses-permission
        android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
        tools:ignore="ProtectedPermissions"
        tools:node="replace"
        tools:remove="android:maxSdkVersion" />
<uses-feature
        android:name="android.hardware.camera.front"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.microphone"
        android:required="true" />

Необходимо знать: я не заметил этой проблемы с другими webRT C -провайдеры, но я должен использовать моего провайдера. Любая помощь, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...