Android:WebView - 没有为会议启用摄像头和麦克风

Posted

技术标签:

【中文标题】Android:WebView - 没有为会议启用摄像头和麦克风【英文标题】:Android: WebView - not getting Camera and Mic enabled for conference 【发布时间】:2020-09-14 04:23:02 【问题描述】:

我们连接到https://meet.jit.si 进行视频会议。如果我们在 android 设备上使用 chrome 浏览器(在 Android 7 和 10 上测试),我们可以在启用相机和麦克风的情况下加入。能够打开和关闭它们。但是,如果我们使用 webview 尝试相同的操作,我们甚至不会从网站收到允许访问的提示,并在尝试打开它们时收到“无法访问摄像头/麦克风”错误。

这是我们的代码。

清单

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

在加载时获得运行时权限

    String[] permissions =
            Manifest.permission.READ_EXTERNAL_STORAGE,
             Manifest.permission.WRITE_EXTERNAL_STORAGE,
             Manifest.permission.INTERNET,
             Manifest.permission.RECORD_AUDIO,
             Manifest.permission.CAMERA;

    ActivityCompat.requestPermissions(
            this,
            permissions,
            1010);

将网页加载到 WebView 中

String url = "https://meet.jit.si/testingconf49854";
WebView webView = findViewById(R.id.webView);
WebSettings mWebSettings = webView.getSettings();
mWebSettings.setLoadsImagesAutomatically(true);
mWebSettings.setBlockNetworkLoads(false);
mWebSettings.setjavascriptEnabled(true);
mWebSettings.setLoadWithOverviewMode(true);
mWebSettings.setUseWideViewPort(false);
mWebSettings.setTextZoom(70);
mWebSettings.setCacheMode( WebSettings.LOAD_NO_CACHE );
mWebSettings.setUserAgentString("Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (Khtml, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36");
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(true);

Map<String, String> noCacheHeaders = new HashMap<String, String>(2);
noCacheHeaders.put("Pragma", "no-cache");
noCacheHeaders.put("Cache-Control", "no-cache");
webView.loadUrl(url, noCacheHeaders);

请让我们知道我们在这里缺少什么。感谢您的帮助。

【问题讨论】:

【参考方案1】:

获得这些权限后,您需要像这样覆盖WebChromeClient 中的onPermissionRequest

webView.setWebChromeClient(new WebChromeClient() 
  @Override
   public void onPermissionRequest(final PermissionRequest request) 
       request.grant(request.getResources());

);

【讨论】:

太棒了,在 Android 7 和 10 上都能完美运行。非常感谢您提供准确而及时的帮助。 真的很好用,几乎要花很多时间寻找答案,非常感谢 这是一个很好的答案,但 Android 不同意。请参阅文档:developer.android.com/reference/android/webkit/… 您需要根据您的应用程序的权限为请求的每个权限授予访问权限。如果服务器的某个WEB页面通过HTML代码请求访问Manifest文件中没有设置的资源,就会出现ANR。您还知道,您的 Manifesto 文件中的权限必须事先获得批准。【参考方案2】:

你可以这样尝试,对我来说完美无缺。这是我的代码:

   @Override
           public void onPermissionRequest(PermissionRequest request)
                String[] resources = request.getResources();
                
                switch (resources[0])
                    case PermissionRequest.RESOURCE_AUDIO_CAPTURE:
                        Toast.makeText(getBaseContext(), "Audio Permission", Toast.LENGTH_SHORT).show();
                        request.grant(new String[]PermissionRequest.RESOURCE_AUDIO_CAPTURE);
                    break;
                    case PermissionRequest.RESOURCE_MIDI_SYSEX:
                        Toast.makeText(getBaseContext(), "MIDI Permission", Toast.LENGTH_SHORT).show();
                        request.grant(new String[]PermissionRequest.RESOURCE_MIDI_SYSEX);
                    break;
                    case PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID:
                        Toast.makeText(getBaseContext(), "Encrypted media permission", Toast.LENGTH_SHORT).show();
                        request.grant(new String[]PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID);
                    break;
                    case PermissionRequest.RESOURCE_VIDEO_CAPTURE:
                        Toast.makeText(getBaseContext(), "Video Permission", Toast.LENGTH_SHORT).show();
                        request.grant(new String[]PermissionRequest.RESOURCE_VIDEO_CAPTURE);
                    break;
                
            

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这是一个很好的答案,它同意Android人的建议。只需要在 UI 中执行代码。查看他们的文档:developer.android.com/reference/android/webkit/…

以上是关于Android:WebView - 没有为会议启用摄像头和麦克风的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?

如何在android的webview中启用前置摄像头

如何在 webView 中启用 javascript

在 webview 中启用 Javascript 时,Android Webview 未检测到链接点击

原生Android Webview HTML5兼容性

Android-WebView支持input file启用相机/选取照片