Xamarin Essentials权限无法授予权限

Xamarin Essentials权限无法授予权限,xamarin,xamarin.forms,xamarin.essentials,plugin.media.crossmedia,Xamarin,Xamarin.forms,Xamarin.essentials,Plugin.media.crossmedia,我目前正在编写一个需要使用摄像头的Xamarin表单应用程序,在下面的代码中,我使用Xamarin Essentials权限请求权限,该权限返回为“已授予”;紧接着,我请求使用相机拍照,这会引发以下错误 ex={Plugin.Media.Abstractions.MediaPermissionException:需要摄像头权限 权限代码 public static async Task<bool> GetPermission<TPermission>() where TP

我目前正在编写一个需要使用摄像头的Xamarin表单应用程序,在下面的代码中,我使用Xamarin Essentials权限请求权限,该权限返回为“已授予”;紧接着,我请求使用相机拍照,这会引发以下错误

ex={Plugin.Media.Abstractions.MediaPermissionException:需要摄像头权限

权限代码

public static async Task<bool> GetPermission<TPermission>() where TPermission : BasePermission, new()
    {
        var hasPermission = await Permissions.CheckStatusAsync<TPermission>();

        if (hasPermission == PermissionStatus.Granted)
            return true;
        else if (hasPermission == PermissionStatus.Disabled)
            return false;

        var result = await Permissions.RequestAsync<TPermission>();
        if (result != PermissionStatus.Granted)
            return false;

        return true;
    }
公共静态异步任务GetPermission(),其中TPermission:BasePermission,new() { var hasPermission=等待权限。CheckStatusAsync(); if(hasPermission==PermissionStatus.grated) 返回true; else if(hasPermission==PermissionStatus.Disabled) 返回false; var result=await Permissions.RequestAsync(); 如果(结果!=PermissionStatus.grated) 返回false; 返回true; } 照片管理器代码

if(!await PermissionHelpers.GetPermission<Permissions.Camera>())
        {
            await new ErrorAlert().Show("App can't take a picture without permission to use the camera");
            return string.Empty;
        }

        var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
        {
            PhotoSize = PhotoSize.Small,
            SaveToAlbum = false
        });
if(!wait PermissionHelpers.GetPermission())
{
等待新的ErrorAlert().Show(“未经允许使用相机,应用程序无法拍照”);
返回字符串。空;
}
var photo=await CrossMedia.Current.TakePhotoAsync(新存储摄像机)选项
{
PhotoSize=PhotoSize.Small,
SaveToAlbum=false
});
如前所述,GetPermission方法返回true,但仍然抛出错误

我现在在安卓上运行这个。 My AndroidManifest.xml在其中具有这些权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

我现在制作了一个示例项目来展示我的问题

您必须将摄像头权限添加到Android清单文件中

在VisualStudio中,右键单击android项目

进入选项->构建->安卓应用程序,勾选显示摄像头的所需权限框

NB:如果要录制,您可能还需要启用麦克风和音频权限

您还必须添加:

<uses-feature android:name="android.hardware.camera" />

到您的android清单。

别忘了

Android

protected override void OnCreate(Bundle savedInstanceState) {
    //...
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
    //...

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

首先,我注意到您使用的是
Xam.Plugin.Media
,这个插件需要
WRITE\u EXTERNAL\u STORAGE
READ\u EXTERNAL\u STORAGE
android.permission.CAMERA
在android中,您应该在运行时请求这些权限

您可以在
main活动中使用以下代码

  public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != (int)Permission.Granted)
        {
            RequestPermissions(new string[] { Manifest.Permission.Camera, Manifest.Permission.WriteExternalStorage, Manifest.Permission.ReadExternalStorage }, 0);
        }

    } 
这里是运行gif

更新

如果使用此
CrossMedia
,则需要授予存储和相机权限。请打开
PhotoManager.cs
添加请求存储代码,如以下代码所示

     public class PhotoManager
{
    public async Task<string> TakeNewPhoto()
    {
        try
        {
            if (!CrossMedia.IsSupported || !CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            {
                return string.Empty;
            }

            if (!await PermissionHelpers.GetPermission<Permissions.Camera>())
            {
                return string.Empty;
            }
            //=====================================add above line==================================================

            if (!await PermissionHelpers.GetPermission<Permissions.StorageWrite>())
            {
                return string.Empty;
            }

            var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                PhotoSize = PhotoSize.Small,
                SaveToAlbum = false
            });

            if (photo != null)
            {
                return "photo taken successfully";
            }

            return string.Empty;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
}
公共级照片管理器
{
公共异步任务TakeNewPhoto()
{
尝试
{
如果(!CrossMedia.IsSupported | | |!CrossMedia.Current.IsCameraAvailable | | |!CrossMedia.Current.IsTakePhotoSupported)
{
返回字符串。空;
}
如果(!wait PermissionHelpers.GetPermission())
{
返回字符串。空;
}
//================================================================添加到上面的行==================================================
如果(!wait PermissionHelpers.GetPermission())
{
返回字符串。空;
}
var photo=await CrossMedia.Current.TakePhotoAsync(新存储摄像机)选项
{
PhotoSize=PhotoSize.Small,
SaveToAlbum=false
});
如果(照片!=null)
{
返回“照片拍摄成功”;
}
返回字符串。空;
}
捕获(例外情况除外)
{
返回ex.消息;
}
}
}
这是您的IssueProject运行的GIF


感谢您花了这么多时间帮助我解决这个问题。 事实证明,如果您使用的是Xamarin essentials 1.5.0版,则需要将CurrentActivity NuGet插件安装到android项目中


或者,一个更好的解决方案是更新到1.5.1,它完全解决了这个问题。

哪个平台?当前运行在Android上这些已经被添加,我会将其添加到我的票证中,目前没有录制视频的规范,但我会将其牢记在心,如果该更改将构建->清洁解决方案,然后run@BenPrice看看这个答案哟你还必须添加权限硬件摄像头成功地添加android.hardware.camera没有什么区别,我也尝试过删除bin/obj,然后重新启动visual studio!你是在设备上还是在模拟器上运行它?我猜是设备?尝试卸载,然后从头开始。这两个都在我的MainActivity.cs中,值得加倍努力你这么做了吗?是的,我和James有相同的设置,我确实设置了不同的外部路径,但即使将它们更改为James'也不会产生任何结果。尝试相同的外部路径我尝试将你的if语句添加到我的OnCreate中,但它仍然请求权限,权限被授予,然后拍照会引发权限异常这甚至表明,在android应用程序设置中的应用程序下授予了权限supdate:在使用OnCreate方法中的代码进行完全干净的重建时,权限按预期工作。我的印象是,可以在需要权限时询问权限,但这里的情况似乎不是这样。这是如何做到的是否曾经在用户尝试使用相机时提出问题,但他们在事后接受了许可,但相机仍然出现故障。您是否像我一样获得了结果?如果您可以像我一样获得结果,您可以查看我的更新答案以获得运行时许可。如果回答有帮助,请不要忘记将其标记为“答案”。这将帮助其他有类似问题的人。我没有正确的结果不,答案是