[英]Xamarin.Forms WebView not working with WebRTC
I have worked on WebRTC project, it all works on Web Browser but when I put in in Application WebView, it said not authorized to access device
kind a message.我从事过 WebRTC 项目,它都适用于 Web 浏览器,但是当我输入应用程序 WebView 时,它说not authorized to access device
类消息。
I read other solution on granting access on permission request, it seems no luck for me yet;我阅读了其他关于根据权限请求授予访问权限的解决方案,但对我来说似乎还不走运; still cannot access the camera/mic仍然无法访问相机/麦克风
Here's some of my implementations (C# language):这是我的一些实现(C# 语言):
...
Control.SetWebChromeClient(new WebChromeClient(context))
...
//on WebChromeClient class
public override void OnPermissionRequest(PermissionRequest request)
{
mContext.RunOnUiThread(() =>
{
request.Grant(request.GetResources());
});
}
The same implementations done in Java Android, the same results not authorized
.在 Java Android 中完成了相同的实现, not authorized
的结果相同。 Tested device is on Android 9 & Android 10.测试设备在 Android 9 & Android 10。
Other android permissions used:其他使用的android权限:
<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" />
Any implementation on Java or C# acceptable. Java 或 C# 上的任何实现都可接受。 Hope you can give some suggestions.希望你能给点建议。
As per @WendyZang-MSFT suggestion using PermissionPlugin
, here's the code below.根据@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;
}
}
This is my runtime permission:这是我的运行时权限:
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);
}
}
Running on PermissionPlugin
seems good as it asking permission on web loaded, still got error said:在PermissionPlugin
上运行似乎很好,因为它在加载 web 时请求许可,但仍然出现错误:
Requires MODIFY_AUDIO_SETTINGS and RECORD_AUDIO. No audio device will be available for recording
On Xamarin.Forms, you could use Permissions Plugin.在 Xamarin.Forms 上,您可以使用权限插件。 https://github.com/jamesmontemagno/PermissionsPlugin https://github.com/jamesmontemagno/PermissionsPlugin
Add permission in Manifest file:在 Manifest 文件中添加权限:
<uses-permission android:name="android.permission.CAMERA" />
Create a Utils.cs创建一个 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;
}
}
Uasge:用法:
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
}
Here is a code sample i done before about how to request permission of camera.这是我之前完成的关于如何请求相机权限的代码示例。 Xamarin - Requesting camera permissions in WebView Xamarin - 在 WebView 中请求相机权限
I have found the solution and faced other issues.我找到了解决方案并面临其他问题。 Base on @Wendy-Zhang answer on Xamarin - Requesting camera permissions in WebView , it doesn't work for me if follow single solution, instead, I put those 2 solutions, that make the trick.基于@Wendy-Zhang 在 Xamarin 上的回答 - 在WebView 中请求相机权限,如果遵循单一解决方案,它对我不起作用,相反,我提出了这 2 个解决方案,这就成功了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.