Разрешения Xamarin Essentials не могут предоставить разрешение - PullRequest
0 голосов
/ 10 марта 2020

В настоящее время я пишу приложение Xamarin Forms, которое требует использования камеры, в приведенном ниже коде я запрашиваю разрешение с использованием разрешений 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;
    }

Код менеджера фотографий

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 для проблемы

Ответы [ 4 ]

1 голос
/ 10 марта 2020

не забудьте

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

Документация

0 голосов
/ 12 марта 2020

спасибо за все ваше время, потраченное на то, чтобы помочь мне решить эту проблему. Оказалось, что если вы используете Xamarin essentials версии 1.5.0, вам необходимо установить плагин CurrentActivity NuGet в свой проект android.

Или, более подходящее решение - это обновление до 1.5.1, которое решает проблему. полностью.

0 голосов
/ 11 марта 2020

Прежде всего, я заметил, что вы используете Xam.Plugin.Media, этот плагин должен WRITE_EXTERNAL_STORAGE, READ_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.

enter image description here

Обновление

Если вы используете это 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;
        }
    }
}

Вот ваш вопросПроекты GIF.

enter image description here

0 голосов
/ 10 марта 2020

Вы должны добавить разрешения для камеры в ваш Android файл манифеста!

В Visual Studio щелкните правой кнопкой мыши ваш проект android.

Go в Options -> Build -> Android Примените и установите флажки в необходимых разрешениях, в которых указано «камера».

Примечание: Если вы собираетесь записывать, возможно, вы также захотите включить разрешения для микрофона и звука.

Вы также должны добавить:

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

К вашему android манифесту.

...