Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

app里面嵌入H5页面 关于获取麦克风权限的问题 #226

Open
tangtangyue opened this issue Jun 7, 2024 · 6 comments
Open

app里面嵌入H5页面 关于获取麦克风权限的问题 #226

tangtangyue opened this issue Jun 7, 2024 · 6 comments

Comments

@tangtangyue
Copy link

app里面嵌入H5页面 首次进入的时候app获取一次麦克风权限 对应H5也获取一次权限 是为啥呢?能不能这个授权就出现一次,而且ios每次都要重新授权 大佬怎么解决

@xiangyuecn
Copy link
Owner

app都支持静默授权,app适配一下就可以了,只要app有系统录音权限就可以了

README里面有写,直接参考就可以了

Recorder/README.md

Lines 317 to 364 in fe968d1

## 【附】Android App - WebView中录音示例
在Android App WebView中使用本库来录音,需要在App源码中实现以下两步分:
1.`AndroidManifest.xml`声明需要用到的两个权限
``` xml
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
```
2. `WebChromeClient`中实现`onPermissionRequest`网页授权请求
``` java
@Override
public void onPermissionRequest(PermissionRequest request) {
//需判断request.getResources()中包含了PermissionRequest.RESOURCE_AUDIO_CAPTURE才进行权限处理,否则不认识的请求直接deny()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//录音是敏感权限,必须app先有录音权限后,网页才会有录音权限,伪代码:
App的系统录音权限请求()
.用户已授权(()->{
//直接静默授权,或者再弹个确认对话框让用户确认是否允许此网页录音后grant|deny
request.grant(request.getResources());
})
.用户拒绝授权(()->{
request.deny();
})
}
}
```
> 注:如果应用的`腾讯X5内核`,除了上面两个权限外,还必须提供`android.permission.CAMERA`权限。另外无法重写此`onPermissionRequest`方法,默认他会自己弹框询问(如果点了拒绝就很惨了),可以通过调用`webView.setWebChromeClientExtension`来重写X5的`IX5WebChromeClientExtension.onPermissionRequest`方法来进行权限处理,参考此篇[X5集成文章](https://www.cnblogs.com/xiangyuecn/p/13450916.html)最后面的网页权限处理代码。
如果不出意外,App内显示的网页就能正常录音了。
[app-support-sample/demo_android](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample/demo_android)目录中提供了Android测试源码(如果不想自己打包可以用打包好的apk来测试,文件名为`app-debug.apk.zip`,自行去掉.zip后缀)。
> 排查 [#46](https://github.com/xiangyuecn/Recorder/issues/46) `Android WebView`内长按录音不能收到`touchend`问题时,发现touch事件会被打断,反复折腾,最终发现是每次检测权限都会调用`Activity.requestPermissions`,而`requestPermissions`会造成WebView打断touch事件,进而产生H5、AppNative原生录都会产生此问题;最后老实把精简掉的`checkSelfPermission`加上检测一下是否已授权,就没有此问题了,囧。
[](?)
## 【附】iOS App - WebView中录音示例
在iOS App WebView中使用本库来录音,需要在App源码 `Info.plist` 中声明使用麦克风 `NSMicrophoneUsageDescription`,无需其他处理,WebView会自己处理好录音权限;注意:iOS App需要在项目Background Modes中勾选Audio才能在后台保持录音,不然App切到后台后立马会停止录音。
iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考[WKUIDelegate](https://developer.apple.com/documentation/webkit/wkuidelegate)中的 `Requesting Permissions` -> `requestMediaCapturePermissionFor`,默认未实现,会导致WebView每次打开后第一次录音时、或长时间无操作再打开录音时均会弹出录音权限对话框。
iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Native层的支持,具体参考RecordApp中的[app-support-sample/demo_ios](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample/demo_ios),含iOS App源码。

@tangtangyue
Copy link
Author

ios每次都要重新授权 这个呢

@xiangyuecn
Copy link
Owner

iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考WKUIDelegate中的 Requesting Permissions -> requestMediaCapturePermissionFor,默认未实现,会导致WebView每次打开后第一次录音时、或长时间无操作再打开录音时均会弹出录音权限对话框。

@NARUTOne
Copy link

NARUTOne commented Aug 2, 2024

你好,视频会议共享屏幕下,app里面嵌入的H5页面,麦克风占用,导致视频会议对方听不到声音,这种场景,大佬怎么解决呀?麦克风是h5 启用的,app做了默认授权

@xiangyuecn
Copy link
Owner

@NARUTOne 没办法,要么你app提供录音接口给h5进行调用,在开视频的时候把语音流数据传给js进行录制

@NARUTOne
Copy link

@xiangyuecn 好的谢谢,网上也没找到直接的解决方案,也是native端配合H5的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants