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?

Другие вопросы по тегам