【问题标题】:Cordova Android WebRTC Won't Capture Video - AUDO ONLY. Permissions issue?Cordova Android WebRTC 不会捕获视频 - 仅限音频。权限问题?
【发布时间】:2016-08-08 01:46:47
【问题描述】:

我有使用 WebRTC 和 RTCPeerConnection 连接两个客户端以允许他们聊天的 cordova 应用程序。它在浏览器和 iOS 上成功运行(使用 webRTC shim)。但是,在 Android 上仅捕获和发送音频,没有视频!这是代码。该视频甚至没有附加到#localVideo elem (which might be a whole other problem in and of itself)!

navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia ||
                         navigator.msGetUserMedia
navigator.getUserMedia({video: true, audio: true}, function (stream) {
  var video = document.getElementById('localVideo')
  video.src = window.URL.createObjectURL(stream)
  video.play()
  window.myRTC.pc1.addStream(stream)
  console.log(stream)
  console.log('adding stream to pc1')
  window.myRTC.setupDC1()
  window.myRTC.pc1.createOffer(function (desc) {
    window.myRTC.pc1.setLocalDescription(desc, function () {}, function () {})
    console.log('created local offer', desc)
  },
  function () { console.warn("Couldn't create offer") },
  window.myRTC.sdpConstraints)
}, function (error) {
  console.log('Error adding stream to pc1: ' + error)
})

我相当确信这是一个权限问题。这是我手机上该应用程序权限的屏幕截图:

您可以看到“录制音频”存在,但没有摄像头或捕获视频。

这是我的 config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget id="org.unicomm" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
     ....
     <platform name="android">
        <config-file parent="/manifest" target="AndroidManifest.xml">
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.RECORD_AUDIO" />
            <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <uses-permission android:name="android.permission.READ_PHONE_STATE" />
            <uses-permission android:name="android.permission.RECORD_VIDEO" />
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
            <uses-feature android:name="android.hardware.camera" />
            <uses-feature android:name="android.hardware.camera.autofocus" />
            <uses-feature android:glEsVersion="0x00020000" android:required="true" />
            <uses-permission android:name="android.permission.CAMERA" />
            <uses-permission android:name="android.permission.INTERNET" />
        </config-file>
    </platform>
</widget>

奇怪的是,并非所有这些权限都会写入我的 AndroidManifest.xml:

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="org.unicomm" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
</manifest>

作为最后的努力,我尝试使用permissions plugin

var permissions = cordova.plugins.permissions;
permissions.requestPermissions(
    [permissions.CAMERA,permissions.RECORD_AUDIO,permissions.RECORD_VIDEO],
    function(status) {console.log(status)
        if(!status.hasPermission) {
            errorCallback();
        } else {
            run();
        }
     },
     function() {
         alert("We need those permissions!")
     }
);

但它只是返回{hasPermission: true}

【问题讨论】:

    标签: cordova webrtc android-permissions


    【解决方案1】:

    不知道谁是被否决的小丑......尤其是没有给出评论或理由。如果我的问题不好,或者在某种程度上是错误的,我真的很想知道为什么。

    最终成为权限问题。我不知道我的 config.xml 做错了什么,以为我在关注科尔多瓦文档。最终安装了this plugin。它终于对我要求从我的 config.xml 进行的 AndroidManifest.xml 进行了更改。

    这是我使用的config.xml:

    <?xml version='1.0' encoding='utf-8'?>
    <widget id="org.unicomm" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
        ...
        <plugin name="cordova-plugin-settings-hook" spec="~0.2.3" />
        <content src="index.html" />
        <access origin="*" />
        <allow-intent href="http://*/*" />
        <allow-intent href="https://*/*" />
        <allow-intent href="tel:*" />
        <allow-intent href="sms:*" />
        <allow-intent href="mailto:*" />
        <allow-intent href="geo:*" />
        <allow-intent href="stun:*" />
        <platform name="android">
            <allow-intent href="market:*" />
        </platform>
        <platform name="android">
            <config-file target="AndroidManifest.xml" parent="/*">
                <uses-permission android:name="android.permission.CAMERA" />
                <uses-feature android:name="android.hardware.camera" />
                <uses-feature android:name="android.hardware.camera.autofocus" />
                <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                <uses-permission android:name="android.permission.RECORD_AUDIO" />
                <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
                <uses-permission android:name="android.permission.READ_PHONE_STATE" />
                <uses-permission android:name="android.permission.RECORD_VIDEO" />
                <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
                <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
                <uses-feature android:glEsVersion="0x00020000" android:required="true" />
                <uses-permission android:name="android.permission.INTERNET" />
           </config-file>
        </platform>
        ...
    </widget>
    

    WebRTC 现在可以工作了!哇!

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但我得到了一些工作:

    从 Android Marshmallow 开始,您必须在运行时请求许可。这就是你尝试的“cordova-plugin-android-permission”插件应该做的;但是正如您所提到的, requestPermissions() 函数似乎没有做任何事情(除了返回当前权限)。

    我收到了 requestPermissions() 调用(来自plugin),使用以下步骤:

    1. 通过将其添加到您的 config.xml 来表明您的目标是 Android Marshmallow。 (根据这个答案https://stackoverflow.com/a/41595068/7470370

      &lt;preference name="android-targetSdkVersion" value="23" /&gt;

    2. &lt;uses-permissions&gt; 行似乎也是必需的,并且肯定支持旧版本。我用过这个(因为我的情况不需要音频)。

      <config-file platform="android" target="AndroidManifest.xml" parent="/manifest" mode="add"> <uses-permission android:name="android.permission.CAMERA" /> </config-file>

    3. 顺便说一句,KitKat 中的 WebView 并不能很好地支持 webrtc,所以我也添加了这个来排除不支持的版本:

      &lt;preference name="android-minSdkVersion" value="21" /&gt; &lt;!-- 21=lollipop --&gt;

    【讨论】:

      【解决方案3】:

      非常感谢!该线程为我指明了正确的方向。我对由 ionic-cordova 构建的 config.xml 的最终版本有疑问,出现此错误:

      .../platforms/android/app/src/main/res/xml/config.xml:51: AAPT: 错误:未绑定的前缀。

      我必须切换 xml 标记格式以使 name="android.permission.CAMERA" platform="android" 中断而不是 android:name="android.permission.CAMERA" 才能工作。现在效果很好。

      <platform name="android">
          <config-file parent="/*" target="AndroidManifest.xml">
              <uses-permission name="android.permission.CAMERA" platform="android" />
              <uses-permission name="android.permission.RECORD_AUDIO" platform="android" />
              <uses-permission name="android.permission.MODIFY_AUDIO_SETTINGS" platform="android" />
          </config-file>
      </platform>
      

      【讨论】:

        猜你喜欢
        • 2019-08-11
        • 2021-06-18
        • 2019-12-29
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        • 2016-03-07
        • 1970-01-01
        相关资源
        最近更新 更多