首页 > 解决方案 > 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

标签: javac#androidxamarin

解决方案


在 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 中请求相机权限


推荐阅读