【问题标题】:Xamarin Forms throws Plugin.Media.Abstractions.MediaPermissionException while taking photoXamarin Forms 在拍照时抛出 Plugin.Media.Abstractions.MediaPermissionException
【发布时间】:2019-08-07 21:31:34
【问题描述】:

我正在尝试从 Xamarin Forms 应用程序的图库中捕获图像/拾取图像。我已经安装了 nuget 管理器 > Birdie.MediaPlugin。在单击注册页面中的按钮期间,会引发以下错误;

Plugin.Media.Abstractions.MediaPermissionException: <Timeout exceeded getting exception details 有人可以告诉我们应该在 Xamarin.Forms 应用程序的哪里添加权限吗?

// Register.xaml:

<Image x:Name="imageDisplay" />
<Button x:Name="uploadButton" 
                    Text="Upload Image" Clicked="UploadButton_Clicked"/>

// PlayerDetails.cs

public ImageSource Source { get; internal set; }

//Register.xaml.cs

PlayerDetails myDetails;

 public Register(PlayerDetails playD)
        {
            InitializeComponent();            
            BindingContext = myDetails;

        }

    private async void UploadButton_Clicked(object sender, EventArgs e)
    {
        //myDetails.Image = new Image();

        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
            return;
        }

        var status = await GetPermissions();

        if(status == true)
        {

            var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                Directory = "Sample",
                Name = "flower1.jpg"
            });

            if (file == null)
                return;

            await DisplayAlert("File Location", file.Path, "OK");

            myDetails.Source = ImageSource.FromStream(() =>
            {
                var stream = file.GetStream();
                file.Dispose();
                return stream;
            });
        }
        else
        {
            await DisplayAlert("Permissions Denied", "Unable to take photos.", "OK");

            //On iOS you may want to send your user to the settings screen.
            if (Device.RuntimePlatform == Device.iOS)
                CrossPermissions.Current.OpenAppSettings();
        }

    }

//我已经将权限功能拆分如下;

public static async Task<bool> GetPermissions()
    {
        bool permissionsGranted = true;

        var permissionsStartList = new List<Permission>()
    {
        Permission.Location,
        Permission.LocationAlways,
        Permission.LocationWhenInUse,
        Permission.Storage,
        Permission.Camera
    };

        var permissionsNeededList = new List<Permission>();
        try
        {
            foreach (var permission in permissionsStartList)
            {
                var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
                if (status != PermissionStatus.Granted)
                {
                    permissionsNeededList.Add(permission);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Nice, exception! " + ex);
        }

        var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());

        try
        {
            foreach (var permission in permissionsNeededList)
            {
                var status = PermissionStatus.Unknown;
                //Best practice to always check that the key exists
                if (results.ContainsKey(permission))
                    status = results[permission];
                if (status == PermissionStatus.Granted || status == PermissionStatus.Unknown)
                {
                    permissionsGranted = true;
                }
                else
                {
                    permissionsGranted = false;
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Last, exception! " + ex);
        }
        return permissionsGranted;
    }

【问题讨论】:

  • 有大量关于此的文档 - 您是否阅读并遵循了所有步骤? github.com/jamesmontemagno/…
  • @Jason:我已经阅读了一些教程并更新了我的代码。现在在 clcik on button throws Unhandled Exception: Plugin.Media.Abstractions.MediaPermissionException: &lt;Timeout exceeded getting exception details&gt;。我已经按照上面的方法拆分了权限功能。

标签: xamarin xamarin.forms


【解决方案1】:

您也可以更新您的OnClick 事件代码以添加权限逻辑:

var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync<CameraPermission>();
var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync<StoragePermission>();

if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
{
    cameraStatus = await CrossPermissions.Current.RequestPermissionAsync<CameraPermission>();
    storageStatus = await CrossPermissions.Current.RequestPermissionAsync<StoragePermission>();
}

if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
    await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
    return;
}

if (cameraStatus == PermissionStatus.Granted && storageStatus == PermissionStatus.Granted)
{
     var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
    {
        Directory = "Sample",
        Name = "flower1.jpg"
    });

    if (file == null)
    return;

    await DisplayAlert("File Location", file.Path, "OK");

    myDetails.Source = ImageSource.FromStream(() =>
    {
        var stream = file.GetStream();
        file.Dispose();
        return stream;
    });
}
else
{
    await DisplayAlert("Permissions Denied", "Unable to take photos.", "OK");

    //On iOS you may want to send your user to the settings screen.
    if (Device.RuntimePlatform == Device.iOS)
        CrossPermissions.Current.OpenAppSettings();
}

注意:它会变成一个很长的函数,所以我建议把它分解成不同的函数。

【讨论】:

  • 会尝试并尽快回复。
  • '.CheckPermissionStatusAsync' 的红色高亮显示 ...在此处的行 var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync&lt;CameraPermission&gt;(); var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync&lt;StoragePermission&gt;();
  • 我通过以下链接更正了该问题,现在权限问题已解决https://stackoverflow.com/questions/53333745/display-multiple-permission-at-once-xamarin-forms 但是在单击按钮期间,没有任何反应。我现在是模拟器。使用Android 6.0-Api 23。所以你认为我需要在真实设备上连接
  • 现在点击按钮抛出Unhandled Exception: Plugin.Media.Abstractions.MediaPermissionException: &lt;Timeout exceeded getting exception details&gt;我已经更新了我上面的最新代码
  • 模拟器没有摄像头,有些安卓设备没有摄像头,或者摄像头可能坏了,所以这条线会解决这个问题:if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多