Невозможно создать файлы на Android с помощью Xamarin

У меня есть приложение Xamarin-Studio для Android, и я просто хочу загрузить файлы и сохранить их локально. Но когда я пытаюсь создать файл в папке files, я получаю исключение:

File.Create("data/data/com.company.app/files/newFile.png");

дает мне:

System.UnauthorizedAccessException
Access to the path 'data/data/com.company.app/files/newFile.png' is denied.

Что я делаю неправильно?

Ответ 1

Наконец я понял, что File.create() не проблема. У меня был код вроде этого:

string tmpFilePath = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
Java.IO.File tmpFile = new Java.IO.File( tmpFilePath);
tmpFile.Mkdirs ();

Тем не менее, Mkdirs() создает не только все промежуточные каталоги, как я предполагал, но также создает каталог на пути к файлу. Таким образом, файл не может быть создан, потому что уже существует каталог с тем же именем. Правильный способ:

string tmpFile = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
Java.IO.File tmpParentFolder = new Java.IO.File(tmpFile).getParentFile();
tmpParentFolder.Mkdirs ();

В моей защите исключение FileExistsAndIsDirectory было бы гораздо более полезным, чем UnauthorizedAccessException

Ответ 2

Вы должны использовать окружение или изолировать хранилище. Например:

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var filename = Path.Combine(path, "newFile.png");

Ответ 3

Я кодирую Xamarin с VS2013. У меня была ошибка отказа в доступе для каталога, созданного приложением, которое я пишу. Мое приложение создает каталог под названием /storage/emulated/0/POIApp путем конкатенации через:

System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "POIApp");

Я обнаружил, что мне пришлось использовать VS2013 для редактирования "свойств" моего приложения (POIApp), т.е. щелкнуть правой кнопкой мыши значок проекта в проводнике решений; выберите свойства во всплывающем меню. В главном окне VS2013 появится новая вкладка. Слева есть несколько вариантов, например, приложение, Android Manifest, Android Options, Build и т.д. Выберите "Android Manifest". В нижней части главной панели находится раздел "Необходимые разрешения". Моя проблема была решена, когда я проверил "READ_EXTERNAL_STORAGE" и "WRITE_EXTERNAL_STORAGE".

Ответ 4

Добавьте в файл Android.Manifest следующее разрешение

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

Ответ 5

Использование Mono, я думаю, должно быть таким же, как в Xamarin Studio.

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
File.Create(path + "newFile.png");