android 11摄像头在webview上不工作:不支持的mime图像/vnd.android.heic

wa7juj8i  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(901)

我正在使用webview显示我的webapp。不幸的是,我不能从网络视图显示相机。我想用相机扫描一个qrcode(代码是网页端,正在chrome上工作)。
权限设置似乎正确,但我有一个关于不支持的mime类型的警告。
使用的设备运行在android 11(api 30)上。
我尝试了很多在文档或其他帖子上找到的解决方案,但似乎没有什么能改变这种情况。
我的Web应用程序是用angulardart编写的,下面是如何用我的dart代码显示相机:

<video
  #video
  autoplay
  class="video-container"
></video>
@override
  void ngAfterViewInit() {
    VideoElement video = document.querySelector("video");
    window.navigator.mediaDevices.getUserMedia({'video': true}).then((stream) {
      video.srcObject = stream;
      videoStream = stream;
      //this._instascanService.startCapture(video, this.handleQrCodeScanned);
    });
  }

以下是android webview代码:

...
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
...

mWebView.setWebChromeClient(new WebChromeClient() {

            // Grant permissions for cam
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                MainActivity.this.runOnUiThread(new Runnable() {
                    @TargetApi(Build.VERSION_CODES.M)
                    @Override
                    public void run() {
                        if(request.getOrigin().toString().equals("https://mywebapp.com/")) { //In my code, this value is correct
                            Log.d(TAG, "GRANTED"); //Displayed rightly in console
                            request.grant(request.getResources());
                        } else {
                            Log.d(TAG, "DENIED");
                            request.deny();
                        }
                    }
                });
            }
...
...

舱单:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />

<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />

最后是控制台输出:

I/CameraManagerGlobal: Connecting to camera service
D/MainActivity: onPermissionRequest
D/MainActivity: https://mywebapp.com/
D/MainActivity: GRANTED
E/cr_VideoCapture: CameraDevice.StateCallback onOpened
W/VideoCapabilities: Unsupported mime image/vnd.android.heic
W/Gralloc4: allocator 3.x is not supported
W/et.mainactivity: Attempt to remove non-JNI local reference, dumping thread
E/cr_VideoCapture: cameraDevice encountered an error

在我的屏幕上,我看到一个灰色的屏幕上有一个大的黑色“播放图标”。
如果我忘了一些重要的信息,不要犹豫。
仅供参考,在使用当前的dart代码之前,我使用instascan.js(带interop),但我遇到了相同的错误。我制作了一个简化的代码来重现这个问题,并很容易地找到解决方案(或者没有)。
提前谢谢,

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题