Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin-在WebView中请求相机权限_C#_Xamarin_Xamarin.forms_Xamarin.android - Fatal编程技术网

C# Xamarin-在WebView中请求相机权限

C# Xamarin-在WebView中请求相机权限,c#,xamarin,xamarin.forms,xamarin.android,C#,Xamarin,Xamarin.forms,Xamarin.android,我想为我的web应用程序制作一个容器应用程序,我决定在Xamarin中这样做,因为项目的其余部分也是.NET 最初,我从Xamarin示例页面下载并设置项目: 我只是在WebPage.cs中更改了几个变量: 其次,我更新了App.cs以满足我的需要: 轰!我有一个应用程序 然后是真正的斗争。在web应用程序中,我可以–在浏览器中打开站点()时–单击一个按钮,从设备请求权限,然后在同一窗口中显示摄像头提要 在应用程序中执行相同操作时,不会发生任何事情 然后我开始在谷歌上搜索答案,但真的没有找到多

我想为我的web应用程序制作一个容器应用程序,我决定在Xamarin中这样做,因为项目的其余部分也是.NET

最初,我从Xamarin示例页面下载并设置项目:

我只是在WebPage.cs中更改了几个变量:

其次,我更新了App.cs以满足我的需要:

轰!我有一个应用程序

然后是真正的斗争。在web应用程序中,我可以–在浏览器中打开站点()时–单击一个按钮,从设备请求权限,然后在同一窗口中显示摄像头提要

在应用程序中执行相同操作时,不会发生任何事情

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

我试着在这里实现Robbit的答案。经过长时间的努力,我成功地编译了它并将其安装到我的设备上,但它实际上并不要求权限

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

我试着在这里实现Robbit的答案。经过长时间的努力,我成功地编译了它并将其安装到我的设备上,但它实际上并不要求权限

我从链接中尝试Robbit提供的代码。

实际上,它工作得很好。为了更好地理解,您可以使用下面的链接进行检查

如果我使用webview直接加载url,它将抛出如下错误

如果我使用Robbit中的自定义渲染器,它将请求MyWebViewRenderer中代码的权限

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

            });

        }

我也检查了你使用的链接,没有发生任何事情。该链接无法打开Android设备中的摄像头

使用Robbit的代码。

在项目中创建MyWebView

public class MyWebView : WebView
{

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

            });

        }
    }
    }
}
在项目的Android部分创建MyWebViewRenderer.cs

public class MyWebView : WebView
{

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

            });

        }
    }
    }
}
您可以从GitHub文件夹
CameraRuntimePermission\u WebView
下载整个项目。页面1用于使用webview测试链接。主页用于使用自定义渲染器进行测试。

更新:

在我之前的回答中,它展示了如何在webview上添加摄像头权限

您提供的链接现在可以使用了。它似乎提供了一个相机预览功能。它需要检查API 23+上的权限

在Xamarin.Forms上,您可以使用权限插件

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

  <uses-permission android:name="android.permission.CAMERA" />
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);
}
然后实施它

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

    }

我已经上传到我的GitHub上了。检查文件夹。测试/相机运行权限\u网络视图/运行时权限

编辑:

如果不想在按钮单击事件中调用此按钮,可以在MainPage.xaml中删除该按钮

MainPage.xaml.cs

private void _button_Clicked(object sender, EventArgs e)
    {
        webView.Source = "https://test.webrtc.org/";//"https://xamarin.swappsdev.net/";
    }
 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);
        }

    }

在遵循了几条启用WebView摄像头的指南之后,我终于成功了

我遵循了上面的所有步骤,尽管收到了允许使用相机的提示,但我始终无法摆脱权限错误(即使调试显示已授予权限)。然后,我将MyWebViewRenderer代码(如上Wendy所示)替换为以下代码(如上所示):


现在摄像机终于开始工作了:-)我不太确定之前代码中的罪犯是什么。非常感谢Wendy、Yelinzh和所有人的全面回复。

希望这能有所帮助,嗨Wendy,非常感谢您非常详细的回复。但是,我仍然遇到同样的旧权限问题。我加载了你的“CameraRuntimePermission\u WebView”项目,并尝试在没有任何修改的情况下运行它。它编译好,并显示您在GIF中显示的空白按钮,但它也告诉我它不能访问WebRTC测试中所需的硬件。之后,我尝试使用我自己的链接:这是我在自己的链接上运行它时的日志。这就是我通常脸朝前撞墙的地方。它从不要求权限。我已经修复了错误,我需要一些时间来编辑我的回复。请稍等片刻。谢谢您宝贵的时间来写这个答案。真的很感激!!正如预期的那样……温迪,这太棒了!非常感谢你。最后一件事,按钮点击是必要的,还是启动应用程序时可能触发权限请求,或者使用某种初始屏幕?不,您可以不使用按钮加载,但在加载页面后需要请求运行时权限。我在编辑中提供了代码。我不愿意承认这一点,但我错过了您移动的部分
webView.Source=”https://xamarin.swappsdev.net/";编码到构造函数中。我花了一段时间才弄明白为什么我只是在看一个白色的屏幕,但除此之外,它还能工作。非常感谢你的帮助和时间!!谢谢你的意见!你永远不知道这些信息何时变得相关,所以我感谢你花时间来整理这个答案。它如预期的那样工作。谢谢你花宝贵的时间写下这个答案。您能告诉我ios是否需要任何类似的程序吗?@Thameem-为回复太晚表示歉意-不幸的是,我还没有对ios进行测试-只有Android。希望你是对的…@Daniëlhofman谢谢你的回复!!
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);
        }

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

    }
[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace App19F_8.Droid
{
    public class CustomWebViewRenderer : WebViewRenderer
    {
        public CustomWebViewRenderer(Context context) : base(context)
        {
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                Control.SetWebChromeClient(new MyWebChromeClient(MainActivity.Instance));
                Control.Settings.JavaScriptEnabled = true;
            }
        }
    }

    public class MyWebChromeClient : WebChromeClient
    {
        Activity mActivity = null;
        public MyWebChromeClient(Activity activity)
        {
            mActivity = activity;
        }
        public override void OnPermissionRequest(PermissionRequest request)
        {
            mActivity.RunOnUiThread(() => {
                request.Grant(request.GetResources());
            });
        }
    }
}
 public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static MainActivity Instance { get; private set; }
        protected override void OnCreate(Bundle savedInstanceState)
        {
            ...
            base.OnCreate(savedInstanceState);

            Instance = this;
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
}