Xamarin - Запрос разрешений камеры в WebView - PullRequest
1 голос
/ 16 января 2020

Я хочу создать контейнер-приложение для своего веб-приложения, и я решил сделать это в Xamarin, потому что остальная часть проекта тоже. NET.

Сначала я загрузил и настроил проект с образцов страниц Xamarin: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/webview?tabs=windows

Я просто изменил несколько переменных в WebPage.cs: https://github.com/xamarin/xamarin-forms-samples/blob/master/WorkingWithWebview/WorkingWithWebview/WebPage.cs

using Xamarin.Forms;

namespace WorkingWithWebview
{
    public class WebPage : ContentPage
    {
        public WebPage()
        {
            var browser = new WebView();
            browser.Source = "https://xamarin.swappsdev.net";
            Content = browser;
        }
    }
}

Во-вторых Я обновил App.cs, чтобы удовлетворить мои потребности: https://github.com/xamarin/xamarin-forms-samples/blob/master/WorkingWithWebview/WorkingWithWebview/App.

using Xamarin.Forms;

namespace WorkingWithWebview
{
    public class App : Application
    {
        public App ()
        {
            MainPage = new WebPage();
        }
    }
}

И бум! У меня было приложение.

Затем началась настоящая борьба. В веб-приложении я могу - при открытии сайта (https://xamarin.swappsdev.net) в браузере - нажать на кнопку, которая запрашивает разрешения у устройства, а затем отобразить канал камеры в том же окне.

При выполнении того же действия в приложении ничего не происходит.

Затем я начал поискать в поисках ответа и действительно ничего не нашел. И ответы, которые я нашел, похоже, относятся к более старой версии Xamarin (?), Поскольку я не смог сравнить файлы и структуру в ответе по сравнению с примером страницы Xamarin. { ссылка }

Я попытался реализовать ответ от Robbit здесь. После долгой борьбы мне удалось скомпилировать и установить его на моем устройстве, но на самом деле он не запрашивает разрешения.

Я в растерянности и мне может понадобиться помощь / руководство.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Обновлено:

В моем предыдущем ответе показано, как добавить разрешение камеры для веб-просмотра.

Ссылка, которую вы указали, работает сейчас. https://xamarin.swappsdev.net/ Кажется, обеспечивает функцию предварительного просмотра камеры. Нужно проверить разрешения на API 23+.

В Xamarin.Forms вы можете использовать Плагин разрешений. https://github.com/jamesmontemagno/PermissionsPlugin

Сначала добавьте разрешение камеры в Android Манифест. Ваш проект. Android> Свойства> Android Манифест> Требуемые разрешения> Камера. После этого будет сгенерировано разрешение пользователя в AndroidManifest. xml.

  <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;
    }
}

В MainActivity.cs добавить код в OnCreate. Метод.

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);

OnRequestPermissionsResult необходим в MainActivity.cs.

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, 
[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

И затем реализовать его.

private async void _button_Clicked(object sender, EventArgs e)
    {
        webView.Source = "https://xamarin.swappsdev.net/";//"https://test.webrtc.org/";

        var status = PermissionStatus.Unknown;

        status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);

        if (status != PermissionStatus.Granted)
        {

            status = await Utils.CheckPermissions(Permission.Camera);
        }

    }

enter image description here

У меня есть загрузка на моем GitHub. Проверьте папку. Test / CameraRuntimePermission_WebView / RuntimePermission

https://github.com/WendyZang/Test.git

Редактировать:

Если вы не хотите вызывать это в кнопке событие щелчка, вы можете удалить кнопку в MainPage.xaml.

MainPage.xaml.cs

 public MainPage()
    {
        InitializeComponent();
        webView.Source = "https://xamarin.swappsdev.net/";
    }

    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);
        }

    }

enter image description here

0 голосов
/ 17 января 2020

Я попытался реализовать ответ от Robbit здесь. После долгой борьбы мне удалось скомпилировать и установить его на моем устройстве, но на самом деле он не запрашивает разрешения.

Я пробую код, предоставленный Robbit по ссылке.
Камера в Xamarin WebView

На самом деле, она работает хорошо. Для лучшего понимания, вы можете использовать ссылку ниже, чтобы проверить. https://test.webrtc.org/

Если я использую веб-представление для прямой загрузки URL-адреса, будет выдано сообщение об ошибке, как показано ниже.

enter image description here

Если я использую пользовательский рендерер из Robbit, он запрашивает разрешение с кодом в MyWebViewRenderer.

public override void OnPermissionRequest(PermissionRequest request)
        {
            mContext.RunOnUiThread(() =>
            {
                request.Grant(request.GetResources());

            });

        }

enter image description here

I Также проверьте ссылку, которую вы использовали, ничего не произошло. По ссылке не будет открываться камера в устройстве Android.

enter image description here

Использование кода от Robbit.

enter image description here

Создайте MyWebView в своем проекте.

public class MyWebView : WebView
{

}

Создайте MyWebViewRenderer.cs в Android части вашего проекта.

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace WebViewDemo.Droid
{
public class MyWebViewRenderer : WebViewRenderer
{
    Activity mContext;
    public MyWebViewRenderer(Context context) : base(context)
    {
        this.mContext = context as Activity;
    }
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);
        Control.Settings.JavaScriptEnabled = true;
        Control.ClearCache(true);
        Control.SetWebChromeClient(new MyWebClient(mContext));
    }
    public class MyWebClient : WebChromeClient
    {
        Activity mContext;
        public MyWebClient(Activity context)
        {
            this.mContext = context;
        }
        [TargetApi(Value = 21)]
        public override void OnPermissionRequest(PermissionRequest request)
        {
            mContext.RunOnUiThread(() =>
            {
                request.Grant(request.GetResources());

            });

        }
    }
    }
}

Использование:

MainPage.xaml

 <StackLayout>
    <Button x:Name="_button" Clicked="_button_Clicked" />
    <local:MyWebView
        x:Name="webView"
        HeightRequest="500"
        WidthRequest="500" />
</StackLayout>

MainPage.xaml.cs

private void _button_Clicked(object sender, EventArgs e)
    {
        webView.Source = "https://test.webrtc.org/";//"https://xamarin.swappsdev.net/";
    }

Вы можете загрузить весь проект из папки GitHub CameraRuntimePermission_WebView. Страница1 используется для проверки связи с веб-просмотром. MainPage используется для тестирования с пользовательским рендерером. https://github.com/WendyZang/Test.git

...