RPi3上的WebRTC使用WebView在getUserMedia()上失败

时间:2018-06-14 15:12:26

标签: webview webrtc raspberry-pi3 android-things

我正在修补Android Things v1.0,并尝试在RaspberryPi 3上使用WebView让WebRTC正常工作。Which in theory should be possible

我理解可能是RPi 3上的camera HAL pipeline only supports 1 stream,这可能是问题的一部分。但是,除非getUserMedia()尝试抓取的不仅仅是单个流,而且我认为不是,它应该只返回本地视频流:

navigator.mediaDevices.getUserMedia({
        audio: false,
        video: true
    })
    .then(
        gotUserMedia, 
        didntGetUserMedia
    );
永远不会调用

gotUserMedia,只调用didntGetUserMedia。此外:

If the browser cannot find all media tracks with the specified types that meet the 
constraints given, then the returned promise is rejected with NotFoundError.

这不是抛出的错误:

object NavigatorUserMediaError

我正在使用可在Mac,Windows和Ubuntu上与Chrome浏览器配合使用的WebRTC Web应用程序来完成所有这些工作。问题似乎在RPi周围。如果我加载Raspbian操作系统并使用Chromium(which supports WebRTC),它仍然无法获取本地视频流。也许问题是相关的?

如果我使用Raspbian上的原生应用打开相机 },如果我只是使用Android Things预览它,那么也能正常工作来自Webview所在的同一个Android应用中的textureView - 但不是同时进行的。

授予的权限已手动完成,并在Manifest中声明:

adb shell pm grant com.rpi.garagetinker android.permission.CAMERA
adb shell pm grant com.rpi.garagetinker android.permission.INTERNET
adb shell pm grant com.rpi.garagetinker android.permission.WRITE_EXTERNAL_STORAGE


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

我没有挖掘Chromium上的错误,但Android Things RPi和Webview的logcat显示了权限问题,这可能与问题有关(鉴于上面的getUserMedia()错误):

12-31 18:00:07.491 772-772/? E//system/bin/webview_zygote32: Failed to make and chown /acct/uid_99000: Permission denied
12-31 18:00:07.491 299-310/? I/ActivityManager: Start proc 772:com.android.webview:sandboxed_process0/u0i0 for webview_service com.rpi.garagetinker/org.chromium.content.app.SandboxedProcessService0

我不知道这是不是问题,如果确定的话,我不确定如何修复。 我认为这是一个权限问题,但我可以授予哪些其他权限?任何指导都表示赞赏。

注意:

  • Pi多次重启。
  • 正在使用HTTPS协议(CA颁发的证书)。
  • 只有一个WebView正在使用中,这是安装在新Android Things图像上的唯一应用。

    在涉及多个浏览器时解决问题的帖子like this没有直接帮助,但建议其他人可能正在使用媒体句柄。

另外,Raspbian上的Chromium也没有提示访问视频(不存在的音频),就像在Chrome其他操作系统上那样。

WebRTC正在使用Chromium开发Raspbian。

1 个答案:

答案 0 :(得分:0)

我对WebRTC API与本机层的交互方式不是很熟悉,但是您可能需要其他权限才能成功进行调用。例如,Android WebRTC sample还请求访问音频的权限(除其他外):

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

我还建议您回顾一下Android Things video call sample,它展示了Android Things上的本机WebRTC SDK,而不是全部通过WebView进行管道传输。

最后,请澄清一下……

  

注意:Android Things在启动时会授予权限,因此Pi已多次重启。

这是不正确的;此行为已从开发人员预览中删除。危险权限必须由Android Things控制台或开发人员工具明确授予。例如,当Android Studio将APK部署到设备时,它会使用adb install -g <apk-file>明确授予所有请求的权限。