【问题标题】:How to solve Permission request must be invoked on main thread in Xamarin?如何解决必须在 Xamarin 的主线程上调用权限请求?
【发布时间】:2021-08-26 12:22:50
【问题描述】:

我有一个 Xamarin 应用程序。

该应用程序有一个 webview 控件来打开一个网站。我想在需要摄像头的特定网页中使用手机的摄像头。如果未打开此特定页面,则无需为应用请求相机权限。所以我想要做的是从页面 javascript 向 Xamarin 应用程序发送请求并请求相机访问权限。

我按照本教程创建了一个混合 webview,允许我将命令从 Javascript 发送到 C#:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview

所以我注册了一个将从 Javascript 调用的操作,如下所示:

        hybridWebView.RegisterAction(async data =>
        {
            DisplayAlert("Hi ! you called this action from Javascript.");

            // Request camera permission
            RequestCameraAccessAsync();
        });

使用 RequestCameraAccessAsync 为:

    private async void RequestCameraAccessAsync()
    {
        var status = await Permissions.CheckStatusAsync<Permissions.Camera>();

        if (status == PermissionStatus.Granted) 
            return;

        if (status == PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS)
        {
            // Prompt the user to turn on in settings
            // On iOS once a permission has been denied it may not be requested again from the application
            return;
        }

        status = Permissions.RequestAsync<Permissions.Camera>().Result;
    }

Javascript 和 C# 之间的桥梁运行良好。但是,每当代码点击请求权限时,它就会失败:必须在主线程上调用权限请求。

我理解这个错误。但是考虑到权限请求应该只在注册的操作上完成,有没有办法让这个工作?

谢谢。

【问题讨论】:

  • 使用 Essentials 主线程
  • @Jason 请问该怎么做?

标签: c# android xamarin xamarin.forms


【解决方案1】:

使用 Essentials MainThread

MainThread.BeginInvokeOnMainThread(() =>
{
    // Code to run on the main thread
});

【讨论】:

  • 太棒了!谢谢:)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
相关资源
最近更新 更多