Невозможно создать файлы на 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");