Проблемы с доступом к файлу из приложения Xamarin.Forms

111
16 марта 2021, 08:20

Столкнулся со следующей проблемой. Есть файл базы данных SQLite, необходимо его скопировать на SD карту смартфона Android. Написал класс для копирования файла с места его хранения приложением в папку на SD карте. В манифесте Android разрешил доступ по чтению и записи: WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE. Но при попытке копирования возникает ошибка: отказано в доступе. Подскажите, что ещё нужно настроить, чтобы получить доступ к SD карте. В выложенном коде попытка скопировать в ExternalStorage и затем на SD карту. В обоих случаях идет отказ в доступе.

    using System.IO;
    using BreadDiary.Droid;
    using Xamarin.Forms;
    [assembly: Dependency(typeof(DBCopyService))]
    namespace BreadDiary.Droid
    {
        public class DBCopyService : IDBCopy
        {
            public DBCopyService()
            {
            }
            public void DBCopy()
            {
                // Копируем файл базы данных в доступное место на SD-карту
                var safePath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "BreadDiary.db3");
                var path = Path.Combine(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath, "BreadDiary.db3");
                if (File.Exists(safePath))
                {
                    System.Diagnostics.Debug.WriteLine(safePath);
                    System.Diagnostics.Debug.WriteLine(path);
                    System.Diagnostics.Debug.WriteLine(Android.OS.Environment.ExternalStorageState);
                    if (Android.OS.Environment.ExternalStorageState == "mounted")
                    {
// Запись в ExternalStorage                        
File.Copy(safePath, path, true);
// Запись на SD карту
File.Copy(safePath, "/storage/sdcard0/Download/BreadDiary.db3", true);
                    }
                }
            }
        }
    }
Answer 1

В общем все было просто. Необходимо было подключить плагин Plugin.Permissions и при первом обращении запросить права доступа во время исполнения приложения.

Второй нюанс заключается в том, что база данных SQLite на мобильном устройстве Android хранится не в одном файле, а в трех, при этом в файле *.db3 хранится только заголовок, а данные хранятся в файлах *.db3_shm и *db3_wal. Т. е. необходимо скопировать три файла.

READ ALSO
Как отправить данные из WebHook в WinForm?

Как отправить данные из WebHook в WinForm?

Мне необходимо приложение WinForm, которое будет клиентом для ViberЯ создал WebHook, который принимает POST запросы от сервера Viber

97
Валидация xml файла

Валидация xml файла

Есть xml файлЕго необходимо проверить согласнo схеме XSD

109
Как сделать запоминание выбора игрока

Как сделать запоминание выбора игрока

Есть у меня в игре скины(другая картинка в персонажа) и нужно ,чтобы после выхода игрока из игры его выбор сохранялся(когда он вернется в игру...

105
Фильтр списка в списке

Фильтр списка в списке

У меня есть список под названием matrixКаждый элемент в matrix содержит еще один список под названием Items

111