我想在Android WebView的PWA中使用QR码扫描仪。

PWA在chrome浏览器上可以正常工作。

我确实有在“应用程序”->“应用程序名称”->“权限”下设置摄像机的权限

minSdkVersion 26和targetSdkVersion 28

在装有Android 9的华为手机上测试

问题是似乎没有授予该权限。 另外,许可请求被重复多次。

Android代码

表现

android:name="android.hardware.camera"

android:required="true" />

根据上一个问题的答案,我在WebViewHelper类中有此代码

lateinit var webkitPermissionRequest : PermissionRequest

...

webView.webChromeClient = object : WebChromeClient() {

override fun onPermissionRequest(request: PermissionRequest) {

webkitPermissionRequest = request

val requestedResources = request.resources

for (r in requestedResources) {

if (r == PermissionRequest.RESOURCE_VIDEO_CAPTURE) {

// In this sample, we only accept video capture request.

val alertDialogBuilder = AlertDialog.Builder(activity)

.setTitle("Allow Permission to camera")

.setPositiveButton("Allow") { dialog, which ->

dialog.dismiss()

webkitPermissionRequest.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))

Log.d(TAG, "Granted")

}

.setNegativeButton("Deny") { dialog, which ->

dialog.dismiss()

webkitPermissionRequest.deny()

Log.d(TAG, "Denied")

}

val alertDialog = alertDialogBuilder.create()

alertDialog.show()

break

}

}

}

...

}

日志:授予权限后,将再次请求(多次)

D/WebViewHelper: Granted

V/InputMethodManager: Reporting focus gain, without startInput

I/PermissionManager: camera remind result:true

I/CameraManager: open camera: 1, package name: "myApp"

I/BackgroundPermManager: pkgName: "myApp", pid: 31365 ,uidOf3RdApk: 10197 ,permType: 0 ,permCfg: 1

I/HwCameraUtil: notifySurfaceFlingerCameraStatus : isFront = true , isOpend = true

I/HwCameraUtil: notifySurfaceFlingerFrontCameraStatus 8011 transact success!

E/cr_VideoCapture: CameraDevice.StateCallback onOpened

I/WebViewHelper: onPermissionRequest

onPermissionRequest

这似乎是问题所在

I/GRALLOC: LockFlexLayout: baseFormat: 11, yStride: 640, ySize: 307200, uOffset: 307200, uStride: 640

E/ion: ioctl c0044901 failed with code -1: Invalid argument

I/chromium: "Unhandled rejection", source: "PWA

"Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.", source: "PWA"

最后,此错误重复出现(无限期)

I/GRALLOC: LockFlexLayout: baseFormat: 11, yStride: 640, ySize: 307200, uOffset: 307200, uStride: 640

JavaScript代码

JS端的代码可以很好地工作,直到在WebView中打开为止。

app.ports.scanQR.subscribe(() => {

// Delay until page loaded

setTimeout(function(){

const video = document.getElementById('media-video');

function returnResult(result) {

app.ports.onGotQR.send(result);

scanner.destroy();

}

const scanner = new QrScanner(video, result => returnResult(result));

scanner.start();

}, 50);

});

}

如果我直接致电getUserMedia,问题仍然存在

if (navigator.mediaDevices.getUserMedia) {

navigator.mediaDevices.getUserMedia({ video: true })

.then(function (stream) {

video.srcObject = stream;

})

.catch(function (err0r) {

console.log("Something went wrong!");

});

}

取得相机的「应用程式」权限:

在WebviewHelper.kt中

webView.webChromeClient = object : WebChromeClient() {

override fun onPermissionRequest(request: PermissionRequest) {

Log.i(TAG, "onPermissionRequest")

// grants permission for app. video not showing

if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)

!= PackageManager.PERMISSION_GRANTED

) {

Log.i(TAG, "Request Permission")

requestPermissions(activity, arrayOf(Manifest.permission.CAMERA), 1010)

} else {

Log.i(TAG, "Permission already granted")

}

...

}

在MainActivity.kt中

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {

when (requestCode) {

cameraRequestCode -> {

Log.d("MainActivity", "onRequestPermissionsResult: Camera Request")

if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {

Log.d("MainActivity", "Camera Request: Permission granted")

// permission was granted, yay!

} else {

// permission denied, boo!

Log.d("MainActivity", "Camera Request: Permission denied")

}

return

}

...

授予相机的“应用程序”权限后,将按预期结果显示以下日志:

D/MainActivity: onRequestPermissionsResult: Camera Request

Camera Request: Permission granted

android webview权限申请_android - 在运行时向摄像机请求WebView权限 - 堆栈内存溢出...相关推荐

  1. android编译终止,android - Android NDK-没有此类文件或目录编译终止-头文件导出问题 - 堆栈内存溢出...

    我正在尝试使用NDK将TagLib C ++库( http://taglib.github.io/ )导入Android. 通过按如下所示将所有源代码放在/jni/taglibroot/下,我能够成功 ...

  2. android 推送的小图标,android - 推送通知中没有声音并且没有自定义的小图标 - 堆栈内存溢出...

    我已经使用Firebase Cloud Messaging实现了推送通知,除了几个自定义问题之外,其他所有功能都正常运行: 当我从Notification Composer工具发送测试通知时,清单中设 ...

  3. android framelayout 高度,android - Android:如何将FrameLayout中的线性布局与底部对齐? - 堆栈内存溢出...

    使用属性layout_gravity对齐FrameLayout中的任何视图 android:layout_gravity:"bottom" /> 但是,如果您尝试将其放置在其 ...

  4. android autolink识别错误,android - autolink窃取ontouch事件,从而反馈触摸列表视图行无效 - 堆栈内存溢出...

    我有一个listview . 并且行布局中包含很少的布局. 在行布局中,我有一个TextView ,我想在其上启用自动链接当我启用自动链接时,链接工作正常但我们点击列表行时得到的反馈不再有效. 在行布 ...

  5. haxe android,android - 具有Android目标的Haxe NME项目无法部署:Activity类不存在 - 堆栈内存溢出...

    我在FlashDevelop中创建了一个NME项目,在Main.hx中加载了位图,然后单击以android为目标的build按钮. 构建成功完成,但是随后出现以下错误: Running process ...

  6. android parcel空指针,android - intent.hasExtra(“ meta”)抛出错误的可包裹异常 - 堆栈内存溢出...

    嗨,在我的应用中,我在这一行代码中看到了一个异常 intent.hasExtra("meta") 这是我的例外 由android.os.BadParcelableException ...

  7. android 7.1内存泄漏,android - Android 7.1和7本机崩溃:libc.so tgkill + 12 - 堆栈内存溢出...

    我看到此原生崩溃与以下堆栈跟踪. 我已经检查了与此类似的其他问题,但是未找到任何类似的解决方案,因为我没有使用TextureView或CardView,并且我也确定这不是由于任何库依赖性而引起的. 有 ...

  8. itext html 转换pdf后 字体加粗,java - 如何使用ITEXTRenderer将HTML转换为PDF时设置新的不同字体 - 堆栈内存溢出...

    我正在尝试将HTML转换为PDF. 在HTML中,有些符号未显示在PDF文档中. 在调试时,我发现&#8209或&#x2011字符在IText库中可用的任何默认字体中均不可用. 我的H ...

  9. c# 未能加载文件或程序集mysql.data,c# - 当我未引用文件或程序集Oracle.ManageddataAccess时,它无法加载 - 堆栈内存溢出...

    我不断 System.IO.FileNotFoundException:'无法加载文件或程序集'Oracle.ManagedDataAccess,Version = 4.122.1.0,Culture ...

最新文章

  1. 如何用bat文件快速计算项目代码行数
  2. ThinkPHP的易忽视点小结
  3. LiveVideoStackCon 2021北京站 9月再次启航!
  4. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态
  5. Maximum Subarray(最大连续子序列和)
  6. Unix系统使用的地址索引结构有什么特点?
  7. 有人做linux源码注释嘛,linux内核工作队列讲解和源码详细注释
  8. 前百度主任架构师创业,两年融资千万美元,他说 AI 新药研发将迎来黄金十年...
  9. 关于百度地图js api的getCurrentPosition定位不准确的解决方法
  10. 免费计算机网络基础ppt,计算机网络基础
  11. java如何向服务器传文件,详解Java向服务端发送文件的方法
  12. python画多边形太阳花
  13. 超级简单基于spring boot高速公路收费系统的设计与实现.rar(含源码及数据库文件)
  14. 电脑远程开机以及控制
  15. java如何获取一月的工作日,Java如何获取工作日名称列表?
  16. 北京大学,南下布局!
  17. 2020年复旦大学计算机学院夏令营经历
  18. 服务器中了挖矿病毒的检测及删除方法
  19. 计算机网络二:应用层
  20. 硅谷上市公司 Confluent 饶军:我能开公司,所有人都有机会

热门文章

  1. mpvue 小程序 页面跳转获取参数
  2. SQLServer windows身份验证连接字符串
  3. java中字节流的选择,求助,java中怎么用字节流读写汉字
  4. Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)
  5. 学生成绩查询java版_学生成绩查询系统,基于ssm的JAVA系统
  6. 注解和反射实现dao层增删改查
  7. 移植uboot之修改代码支持NorFlash记录
  8. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)
  9. Topshelf创建Windows服务
  10. SQL PROMPT5.3.4.1的一些设置选项