目录 快速处理app向系统申请录音与相机权限h5向app申请录音和相机权限 详细解答app权限与h5权限录音与麦克风默许的风险最佳实践 Android WEBview h5 麦克风权限,摄像头(相机)权限实现与填坑。
Android WEBview h5 麦克风权限,摄像头(相机)权限实现与填坑。
app 必须先具备如下权限(本文只讨论录音与相机)
AndroidManifest中添加:
注意:前面两项需要app动态申请
activity.requestPermissions(new String[]{ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},1111);
懒人快速做法(可直接copy代码)
webView.setWebChromeClient(new WebChromeClient(){ @Override public void onPermissionRequest(PermissionRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { request.grant(request.getResources()); } }}
webView.setWebChromeClient(new WebChromeClient(){@Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { result.confirm(); return true; }}
最后完整的WebChromeClient类至少重写上述两个函数:
webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.w(TAG,"onConsoleMessage " + consoleMessage.messageLevel() + " " + consoleMessage.message()); return super.onConsoleMessage(consoleMessage); } @Override public void onPermissionRequest(PermissionRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { request.grant(request.getResources()); request.getOrigin(); } } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { result.confirm(); return true; } });
可以简单这样理解,权限都是向宿主获得,那么app运行中系统中,app权限是向系统申请;h5运行中webview上,webview是app中使用的一个控件,可认为h5的权限是向webview或app申请的。这是要注意的区别,app获得权限不等于h5也获得了权限。
if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ activity.requestPermissions(new String[]{ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE},1111); }else {//已获得权限 }
请求申请activity.requestPermissions(new String[]{ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE},1111);
申请响应@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1111){ if (grantResults.length > 0){ //此处分别判断grantResults 如grantResults[0] == PackageManager.PERMISSION_GRANTED } } }
上述是多个一起申请,实际可单独申请或其他组合进行申请。 public void onPermissionRequest(PermissionRequest request) { request.deny(); }
再来看看PermissionRequestpublic abstract class PermissionRequest {public final static String RESOURCE_VIDEO_CAPTURE = "android.webkit.resource.VIDEO_CAPTURE";public final static String RESOURCE_AUDIO_CAPTURE = "android.webkit.resource.AUDIO_CAPTURE";public final static String RESOURCE_PROTECTED_MEDIA_ID = "android.webkit.resource.PROTECTED_MEDIA_ID";public final static String RESOURCE_MIDI_SYSEX = "android.webkit.resource.MIDI_SYSEX";public abstract Uri getOrigin();public abstract String[] getResources();public abstract void grant(String[] resources);public abstract void deny();
}
```
进一步看出其权限定义是隶属于android.webkit,而且定义出了4个RESOURCE_VIDEO_CAPTURE,//相机
RESOURCE_AUDIO_CAPTURE,//mic
RESOURCE_PROTECTED_MEDIA_ID,
RESOURCE_MIDI_SYSEX。
一般常见的h5是权限是前面两个。
为什么会将录音麦克风分开?主要是因为app和h5的定义不一样,以及范围不一样。就app来讲采集声音/录制音频文件,只需要麦克风(mic)就可以了。如果h5在直播/会议场景中连麦,请求权限的时候,除了要麦克风权限(android.permission.RECORD_AUDIO)外,还需android.permission.MODIFY_AUDIO_SETTINGS
权限,该权限不需要动态申请,但需要添加到AndroidManifest文件中,此时的权限不单是麦克风权限,因此整体叫“录音权限”。
对于h5的录音,app 需要向系统申请两个权限:
多看下日志输出就知道需要的权限了。
我们草草以“默许”解决h5的权限,可能面临的问题是合规审核,被通告整改。
其次也不符合api的设计思想和安全机制。使用场景中存在自动被录音或录像的风险。app过度申请权限。
最好的解决办法是:
app 在onPermissionRequest被调用的时候,弹框让用户确认为h5授权,接着判断app是否具备对应的权限,如果没有则继续向系统申请,申请响应后再为h5授权,流程稍微复杂一点,但不讲究时机同时也是需要时候获取。默许授权存在问题是过度申请,因为时机不确定而需要优先申请。
来源地址:https://blog.csdn.net/lanlangaogao/article/details/131377666
--结束END--
本文标题: Android WebView加载h5打开麦克风与摄像头的权限问题
本文链接: https://www.lsjlt.com/news/373342.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0