Xamarin.Forms Android Файловый обмен, MTP
Я пытаюсь обмениваться файлами между приложением.Net Desktop и приложением Xamarin.Forms для Android. У меня действительно были проблемы с получением ресурсов и помощи, поэтому я хочу, чтобы этот вопрос также обернул некоторые вещи - для других заинтересованных пользователей (не только форм Xamarin)
До сих пор я читал файлы и папки в.Net C#, используя блог Кристофа Джерса и Fun с MTP, и потому, что запись не работала на всех моих устройствах Windows File Stuff от Flauschig
На стороне стены Xamarin.Forms я впервые наткнулся на документ Xamarin и библиотеку lib для хранения из кода pcl, а также Plugin.Permissions.
Со всеми вышеизложенными источниками я смог заставить работать Android на Android (Samsung A5, Android 6.0). С этим описанием файловой структуры я думал, что следующий код всегда получит правильный путь:
public string GetExternalFolder()
{
GetPermission();
var externalFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "Android", "data", "com.exampledom.appname", "files");
if (!Directory.Exists(externalFolder))
CreateFolderStructure();
return externalFolder;
}
GetPermission () берется из Plugin.Permissions и выдает исключение, если разрешение не дано.
CreateFolderStructure () использует pcl.storage - и выглядит следующим образом.
private async void CreateFolderStructure()
{
try
{
IFolder rootFolder = await FileSystem.Current.GetFolderFromPathAsync(Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path));
var subpaths = new[] {"Android", "data", "com.exampledom.appname", "files"};
foreach (var dir in subpaths)
{
if (!string.IsNullOrEmpty(dir))
rootFolder = await rootFolder.CreateFolderAsync(dir, CreationCollisionOption.OpenIfExists);
}
Log("Folder structure created!");
}
catch (Exception e)
{
Log("Folder structure cannot be created!");
Console.WriteLine("Failed to log! " + e.Message);
}
}
Хорошо, теперь вопрос: папка, созданная этим методом, создается только на одном устройстве, на котором я тестировал (подтверждение концепции) - на всех остальных (например, Samsung A3, Android 6.0) ничего не происходит (доказательство беспомощного разработчика). Перезагрузка не является решением. Также на устройстве это работает - разрешение запрашивается, как и ожидалось. На других устройствах нет запроса на разрешение.
Почему нужная папка не создается во время установки? Кажется, что у всех других приложений есть такая папка "Android/data/com.exampledom.appname/files".
Что мне не хватает? Это кажется слишком сложным для импорта / экспорта на Android.
1 ответ
@smack CreationCollisionOptions.OpenIfExists действительно создает папку? Я так не думаю. Нет ли перечисления CreateIfNotExists?