2

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

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

照片管理器代码

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

如前所述,GetPermission 方法返回 true,但仍然抛出错误。

我目前正在Android上运行它。我的 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" />

我现在制作了一个示例项目来展示我的问题 GitHub Repo for the issue

4

4 回答 4

1

不要忘记

安卓

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

文档

于 2020-03-10T15:41:19.570 回答
1

首先,我注意到你使用Xam.Plugin.Media,这个插件需要WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE并且android.permission.CAMERA在 Android 中,你应该在运行时请求这些权限。

您可以在以下代码中使用MainActivity

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

这是您的 issueProjects 正在运行的 GIF。

在此处输入图像描述

于 2020-03-11T05:30:56.320 回答
1

感谢您花费所有时间帮助我解决此问题。事实证明,如果您使用的是 Xamarin Essentials 1.5.0 版,您需要将 CurrentActivity NuGet 插件安装到您的 android 项目中。

或者,更好的解决方案是更新到 1.5.1,它可以完全解决问题。

于 2020-03-12T11:45:50.003 回答
0

您必须将相机权限添加到您的 Android 清单文件中!

在 Visual Studio 中,右键单击您的 android 项目。

转到选项 -> 构建 -> Android 应用程序并勾选所需权限中的框,即相机。

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

您还必须添加:

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

到你的 android 清单。

于 2020-03-10T15:37:05.437 回答