0

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.

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):

...
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. Tested device is on Android 9 & Android 10.

Other android permissions used:

<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. Hope you can give some suggestions.

Editted

As per @WendyZang-MSFT suggestion using PermissionPlugin, here's the code below.

//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:

Requires MODIFY_AUDIO_SETTINGS and RECORD_AUDIO. No audio device will be available for recording
Mr Hery
  • 829
  • 1
  • 7
  • 25
  • 1
    On Xamarin.Forms, you could use Permissions Plugin to request permissions. https://github.com/jamesmontemagno/PermissionsPlugin Here is a code sample i done before about how to request permission of camera. https://stackoverflow.com/questions/59771557/xamarin-requesting-camera-permissions-in-webview – Wendy Zang - MSFT Jun 10 '20 at 06:05
  • @WendyZang-MSFT I read your post before, and I tried already, but still not working. Do i need to put my codes here? – Mr Hery Jun 10 '20 at 06:12
  • 1
    yes, more code would be helpful. – Wendy Zang - MSFT Jun 10 '20 at 06:18
  • It seems the logs doesnt said anything about the camera, but still saying error about the mic. So i added `Permission.Microphone`, I dont know if it was a correct way to do so – Mr Hery Jun 10 '20 at 06:44
  • Delete the `await Utils.CheckPermissions(Permission.Microphone);` when you ask for camera permission. When you run this code, does this throw the error for mic? – Wendy Zang - MSFT Jun 11 '20 at 02:28
  • No error thrown on VS, only on logs. – Mr Hery Jun 11 '20 at 10:02
  • 1
    Does the xamarin project works well? I do not know `WebRTC` well. – Wendy Zang - MSFT Jun 12 '20 at 06:35
  • Its all working now. I ll share the codes later. Thank you Wendy Zhang, I tried to combine both of your solution (the webview & PermissionPlugin implementation), it works now. – Mr Hery Jun 12 '20 at 08:11
  • Glad to help. I would post the way about the PermissionPlugin in the answer. Do not forget to accept as answer. Thanks~ – Wendy Zang - MSFT Jun 12 '20 at 08:29
  • You coud share the code. It would help others who face the same issue. – Wendy Zang - MSFT Jun 12 '20 at 08:31

2 Answers2

0

On Xamarin.Forms, you could use Permissions Plugin. https://github.com/jamesmontemagno/PermissionsPlugin

Add permission in Manifest file:

<uses-permission android:name="android.permission.CAMERA" />

Create a 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

Wendy Zang - MSFT
  • 10,509
  • 1
  • 7
  • 17
  • @Wendy-Zhang, it seem your solution only works on Android, iOS webview still cannot access camera and microphone. Any suggestion? – Mr Hery Jun 12 '20 at 08:39
  • For the IOS permission, you could check the link below. https://learn.microsoft.com/en-us/xamarin/ios/app-fundamentals/security-privacy?tabs=windows – Wendy Zang - MSFT Jun 12 '20 at 08:49
  • Link you provide is to give permission to the app. But it doesn't work, yet. – Mr Hery Jun 12 '20 at 09:46
0

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.

Mr Hery
  • 829
  • 1
  • 7
  • 25