我正在使用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),但我遇到了相同的错误。我制作了一个简化的代码来重现这个问题,并很容易地找到解决方案(或者没有)。
提前谢谢,
暂无答案!
目前还没有任何答案,快来回答吧!