Xamarin - 在 WebView 中请求相机权限

Han*_*ans 4 c# xamarin.android xamarin xamarin.forms

我想为我的 Web 应用程序制作一个容器应用程序,我决定在 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,我更新了 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和繁荣!我有一个应用程序。

然后才是真正的挣扎。在 Web 应用程序中,我可以 –在浏览器中打开站点 ( https://xamarin.swappsdev.net ) 时 – 单击请求设备权限的按钮,然后在同一窗口中显示相机源。

在应用程序中执行相同操作时,没有任何反应。

然后我开始在谷歌上搜索答案,但真的没有找到很多。我发现的答案似乎是旧版本的 Xamarin (?),因为我无法将答案中的文件和结构与 Xamarin 示例页面之一进行比较。 /sf/answers/3539259881/

我尝试在这里实施 Robbit 的答案。经过长时间的努力,我设法编译它并将其安装在我的设备上,但它实际上并没有请求权限。

我不知所措,可能需要一些帮助/指导。

Wen*_*SFT 6

更新:

在我之前的回答中,它展示了如何在 webview 上添加相机权限。

您提供的链接,现在可以使用了。https://xamarin.swappsdev.net/好像提供了相机预览功能。它需要检查 API 23+ 的权限。

在 Xamarin.Forms 上,您可以使用权限插件。https://github.com/jamesmontemagno/PermissionsPlugin

首先,在 Android Manifest 中添加摄像头权限。您的 Project.Android> 属性> Android 清单> 所需权限> 相机。之后,它会在 AndroidManifest.xml 中生成用户权限。

  <uses-permission android:name="android.permission.CAMERA" />
Run Code Online (Sandbox Code Playgroud)

创建一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 MainActivity.cs 中,在 OnCreate 方法中添加代码。

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
Run Code Online (Sandbox Code Playgroud)

MainActivity.cs 中需要 OnRequestPermissionsResult。

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);
}
Run Code Online (Sandbox Code Playgroud)

然后实现它。

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

    }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我已经上传到我的 GitHub 上了。检查文件夹。测试/CameraRuntimePermission_WebView/RuntimePermission

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

编辑:

如果不想在按钮单击事件中调用此方法,则可以删除 MainPage.xaml 中的按钮。

主页.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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明