java - Xamarin.Forms WebView 不适用于 WebRTC
问题描述
我在 WebRTC 项目上工作过,它都可以在 Web 浏览器上工作,但是当我放入 Application WebView 时,它会not authorized to access device
显示一条消息。
我阅读了有关根据权限请求授予访问权限的其他解决方案,但对我来说似乎还没有运气;仍然无法访问相机/麦克风
这是我的一些实现(C# 语言):
...
Control.SetWebChromeClient(new WebChromeClient(context))
...
//on WebChromeClient class
public override void OnPermissionRequest(PermissionRequest request)
{
mContext.RunOnUiThread(() =>
{
request.Grant(request.GetResources());
});
}
在 Java Android 中完成相同的实现,结果相同not authorized
。测试设备运行 Android 9 和 Android 10。
使用的其他安卓权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />
<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
Java 或 C# 上的任何实现都可接受。希望大家能给点建议。
已编辑
根据@WendyZang-MSFT 的建议使用PermissionPlugin
,这里是下面的代码。
//The Utils class
public static class Utils
{
public static async Task<PermissionStatus> CheckPermissions(Permission permission)
{
var permissionStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
bool request = false;
if (permissionStatus == PermissionStatus.Denied)
{
if (Device.RuntimePlatform == Device.iOS)
{
var title = $"{permission} Permission";
var question = $"To use this plugin the {permission} permission is required. Please go into Settings and turn on {permission} for the app.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title, question, positive, negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
request = true;
}
if (request || permissionStatus != PermissionStatus.Granted)
{
var newStatus = await CrossPermissions.Current.RequestPermissionsAsync(permission);
if (!newStatus.ContainsKey(permission))
{
return permissionStatus;
}
permissionStatus = newStatus[permission];
if (newStatus[permission] != PermissionStatus.Granted)
{
permissionStatus = newStatus[permission];
var title = $"{permission} Permission";
var question = $"To use the plugin the {permission} permission is required.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title, question, positive, negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
}
return permissionStatus;
}
}
这是我的运行时权限:
protected override void OnAppearing()
{
base.OnAppearing();
RunTimePermission();
}
public async void RunTimePermission()
{
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
await Utils.CheckPermissions(Permission.Microphone);
}
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Microphone);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Microphone);
}
}
运行PermissionPlugin
似乎很好,因为它要求对 web 加载的权限,仍然得到错误说:
Requires MODIFY_AUDIO_SETTINGS and RECORD_AUDIO. No audio device will be available for recording
解决方案
在 Xamarin.Forms 上,您可以使用权限插件。https://github.com/jamesmontemagno/PermissionsPlugin
在 Manifest 文件中添加权限:
<uses-permission android:name="android.permission.CAMERA" />
创建一个 Utils.cs
public static class Utils
{
public static async Task<PermissionStatus> CheckPermissions(Permission permission)
{
var permissionStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
bool request = false;
if (permissionStatus == PermissionStatus.Denied)
{
if (Device.RuntimePlatform == Device.iOS)
{
var title = $"{permission} Permission";
var question = $"To use this plugin the {permission} permission is required. Please go into Settings and turn on {permission} for the app.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title, question, positive, negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
request = true;
}
if (request || permissionStatus != PermissionStatus.Granted)
{
var newStatus = await CrossPermissions.Current.RequestPermissionsAsync(permission);
if (!newStatus.ContainsKey(permission))
{
return permissionStatus;
}
permissionStatus = newStatus[permission];
if (newStatus[permission] != PermissionStatus.Granted)
{
permissionStatus = newStatus[permission];
var title = $"{permission} Permission";
var question = $"To use the plugin the {permission} permission is required.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title, question, positive, negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
}
return permissionStatus;
}
}
用法:
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
}
这是我之前完成的关于如何请求相机权限的代码示例。 Xamarin - 在 WebView 中请求相机权限
推荐阅读
- f# - F#返回类型的递归模式匹配
- interface - IP 安全摄像头无法连接到 Web 界面
- vue.js - Nuxt.js 中的内容安全策略
- firebase - 获取 ListView 上点击的项目 Firestore 文档 id
- node.js - 使用 node-fetch 而不是 request 签名上传到 cloudinary
- c# - C# UdpClient.Receive 函数在任意数量的循环后不返回
- c# - Web API Core 3.0 将 HttpRequest 主体记录为自定义类对象
- python - 使用 Seaborn 更改两个 y 轴的颜色?
- python - 使用贝叶斯优化时队列为空
- reactjs - 使用 Typescript 进行 Formik 和 FieldArray 映射