VS Xamarin.Forms (Android): доступ к камере и хранилищу запрещен с помощью Xam.Plugin.Media - PullRequest
0 голосов
/ 11 марта 2020

У меня есть приложение Xamarin.Forms, которое я тестирую на Android 10 (на устройстве) в данный момент. Я хочу иметь две кнопки: выбрать фотографию (из хранилища) и сделать фотографию (из камеры). У меня были некоторые проблемы с отсутствием разрешений на доступ к хранилищу и камере, поэтому я следовал этому руководству: https://www.youtube.com/watch?v=IVvJX4CoLUY&t=0s&list=PLv-NAmQyi2iOu7zfbPDhLTXgBwUwVIBga&index=1. Этот урок - все, что мне нужно, так как эти две кнопки обсуждаются здесь. Я использую Xam.Plugin.Media для этого проекта.

Также с этим руководством у меня возникают проблемы с получением разрешений для моей камеры и моего хранилища. Ошибка постоянно одна и та же: «Требуется разрешение камеры». или: «Требуются разрешения на хранение».

Я добавил разрешения для AndroidManifest. xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.takepicturetest1">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="TakePictureTest1.Android"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

Но все равно никаких результатов.

  • Отладка на физическом устройстве: Samsung Galaxy S10, Android 10.
  • Все пакеты обновлены.
  • Visual Studio 2019.

Кто-нибудь знает, как решить эту проблему?

С уважением, Гейн sh

Ответы [ 2 ]

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

Вы можете использовать Xamarin.Essentials.Platform.OnRequestPermissionsResult для запроса разрешений. Добавьте его в методе OnRequestPermissionsResult.

  [Activity(Label = "IssuesApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    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());
        }

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

            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

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

Если вы используете CrossMedia Вы должны получить разрешения StorageWrite и Camera. Вы можете создать класс PermissionUtils для его обработки.

    public static class PermissionUtils
    {
        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 PermissionUtils.GetPermission<Permissions.Camera>())
                {
                    return "You do not have this permission";
                }

Здесь работает GIF.

enter image description here

Вот мое демо, вы можете скачать его и протестировать в своем android 10 эмулятор.

https://github.com/851265601/XFormsCrossMediaPermission

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

Вы также должны обрабатывать разрешения времени выполнения, как задокументировано здесь .

Требуются разрешения WRITE_EXTERNAL_STORAGE & READ_EXTERNAL_STORAGE, но библиотека автоматически добавит это для вас. Кроме того, если ваши пользователи используют Marshmallow, плагин автоматически запросит у них разрешения во время выполнения. Вы должны добавить код подключаемого модуля в свои основные или базовые действия:

Добавить в действие:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...