当前位置: 首页 > 面试题库 >

在wkwebview中启用摄像头和麦克风访问

丁昌翰
2023-03-14
问题内容

我有一个针对移动设备进行了优化的Web应用程序,可用于getUserMedia访问网络摄像头和麦克风资源。

WKWebView要将这个应用包装为A,因为我想提供本机应用体验。我知道,iOS不允许通过浏览器访问摄像机-
但有什么办法来获得权限的网络摄像头/麦克风与本机代码(沿着封装)和饲料这对Web应用程序-也许在某种程度上指向getUserMedia一个本地流源?


问题答案:

是的,看看cordova-plugin-iosrtc和cordova-plugin-wkwebview-
engine
。插件背后的想法如下:

1. 创建一个定义各种WebRTC类和函数的JavaScript文件(WebRTC.js),并将调用传递给WKWebView,例如:

(function() {
  if (!window.navigator) window.navigator = {};
  window.navigator.getUserMedia = function() {
    webkit.messageHandlers.callbackHandler.postMessage(arguments);
  }
})();

2. 在WKWebView中,在文档开始处插入脚本:

let contentController = WKUserContentController();
contentController.add(self, name: "callbackHandler")

let script = try! String(contentsOf: Bundle.main.url(forResource: "WebRTC", withExtension: "js")!, encoding: String.Encoding.utf8)
contentController.addUserScript(WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true))

let config = WKWebViewConfiguration()
config.userContentController = contentController

webView = WKWebView(frame: CGRect.zero, configuration: config)

3. 收听从JavaScript发送的消息:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {
  var webView: WKWebView!

  func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callbackHandler" {
      print(message.body)
      // make native calls to the WebRTC framework here
    }
  }
}

4. 如果需要在JavaScript领域中执行成功或失败回调,请直接在WKWebView中评估函数调用:

webView.evaluateJavaScript("callback({id: \(id), status: 'success', args: ...})", completionHandler: nil)

这些回调需要 调用 之前
存储在JavaScript中的哈希中postMessage,然后必须将哈希键发送到WKWebView。这是commandId插件中的。

int exec_id = 0;
function exec(success, failure, ...) {
  // store the callbacks for later
  if (typeof success == 'function' || typeof failure == 'function') {
    exec_id++;
    exec_callbacks[exec_id] = { success: success, failure: failure };
    var commandId = exec_id;
  }
  webkit.messageHandlers.callbackHandler.postMessage({id: commandId, args: ...})
}

// the native code calls this directly with the same commandId, so the callbacks can be performed and released
function callback(opts) {
  if (opts.status == "success") {
    if (typeof exec_callbacks[opts.id].success == 'function') exec_callbacks[opts.id].success(opts.args);
  } else {
    if (typeof exec_callbacks[opts.id].failure == 'function') exec_callbacks[opts.id].failure(opts.args);
  }
  // some WebRTC functions invoke the callbacks multiple times
  // the native Cordova plugin uses setKeepCallbackAs(true)
  if (!opts.keepalive) delete exec_callbacks[opts.id];
}

5.
当然,为您的项目添加NSCameraUsageDescriptionNSMicrophoneUsageDescription权限Info.phtml" target="_blank">list

Keep in mind this is a non-trivial task, but that’s the general idea behind
bridging JavaScript, WKWebView, and native framework code with asynchronous
callbacks.



 类似资料:
  • 这些显示在我的logcat里 无法通知WebView/VideoCapabilities:无法识别的配置文件2130706434用于视频/AVC W/VideoCapabilities:不支持的mime视频/Divx W/VideoCapilities:不支持的mime视频/Divx4 W/VideoCapilities:不支持的mime视频/MP4V-ESDP W/VideoCapilities

  • 播放音符 播放声音 录制 文字转语音

  • 问题内容: 我一直在尝试使用android模拟器上的语音识别来做某事。 最终安装了市场和Google语音搜索应用程序后,我已经非常接近使仿真器能够执行我想要的操作了- 可以识别我的语音。首先,我需要使仿真器能够记录音频,或者至少认为存在麦克风。 我相信adb曾经有-mic选项-但是我认为它不再存在。 有没有人做过,还是有人可以阐明它。 问题答案: 您看过本教程吗?看到评论: 你们还不能在模拟器中录

  • 问题内容: 我正在尝试通过Java访问麦克风的级别。我不需要录制任何东西,我只想知道声音水平的相对范围。 这可以实时吗? 如果这是不可能的,那么这可能会起作用:当电平超过某个值时开始记录,当电平下降到一定水平以下一段时间后停止录制四分之一秒的位并读取它的音量,如果它在阈值以下停止录音。 提前致谢 问题答案: 您可以通过Sound API访问麦克风,但不会给您简单的响度级别。您只需要捕获数据并就其声

  • 我是新的Android 6.0代码,请提供以下代码的解决方案: 注意:适用于打开库时

  • 我想直播Android麦克风,可以使用VLC播放器等听到。 Playstore主要提供IP摄像头应用,但这些应用是通过内部网络实现的。我想在互联网上播放流媒体。 可能吗? 我尝试了以下代码片段,但目前不起作用: 在VLC播放器前,我试着听(媒体)- 还有别的办法吗?