Директория не найдена исключение после выбора файла в проводнике

РЕДАКТИРОВАТЬ: Я провел некоторые исследования и важно для моего вопроса это:

Я использую объект Intent, чтобы получить путь к файлу от пользователя. Он использует какой-то случайный файловый менеджер. Тот, который я установил в эмулятор, возвращает путь следующим образом:

fileName = "file: ///mnt/sdcard/Alien/PlayersBase.btb"

Это не работает

Если бы я обращался к одному и тому же файлу программно, зная, где находится файл, я сделал бы это следующим образом:

string str = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToString(), "Alien/PlayersBase.btb");

Сейчас

str = "/mnt/sdcard/Alien/PlayersBase.btb"

Второй путь отличается и работает отлично.

Поэтому мой вопрос, вероятно, должен выглядеть примерно так: что я могу ожидать от объекта Intent и почему строка, возвращенная первым проводником, обнаруженным мной в Google, возвращает что-то, что не работает?


Первая версия вопроса

Моя цель - позволить пользователю выбрать файл в Android, и я хочу скопировать этот файл в локальную папку моего приложения.

Из этого вопроса я взял третий ответ, чтобы пользователь мог выбрать файл на устройствах Samsung и других устройствах. Код ниже, кажется, работает нормально, Android дает мне выбор, какой проводник я хочу использовать, я могу просматривать и выбирать файл. Просто для полноты я выложу код здесь:

Activity mainActivity = context as Activity;
string minmeType="*/*";

Intent intent = new Intent(Intent.ActionGetContent);
intent.SetType(minmeType);
intent.AddCategory(Intent.CategoryOpenable);

//special intent for Samsung file manager
Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
// if you want any file type, you can skip next line 
sIntent.PutExtra("CONTENT_TYPE", minmeType);
sIntent.AddCategory(Intent.CategoryDefault);

Intent chooserIntent;
if (mainActivity.PackageManager.ResolveActivity(sIntent, 0) != null)
{
    // it is device with samsung file manager
    chooserIntent = Intent.CreateChooser(sIntent, "Open file");
    chooserIntent.PutExtra(Intent.ExtraInitialIntents, new Intent[] { intent });
}
else
{
    chooserIntent = Intent.CreateChooser(intent, "Open file");
}
try
{
    mainActivity.StartActivityForResult(intent, 3);
}
catch
{
    SendMessageToUser("No suitable File Manager was found.");
}

Затем я поместил этот код в мою деятельность

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode==3 && resultCode == Result.Ok) //pick file
        OnFileSelected(data.DataString);
}

И я пытаюсь работать с файлом здесь

public void OnFileSelected(string fileName)
{
    try
    {
        Stream streamSource = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        ...
    }
    catch (Exception e)
    {
        string message = e.ToString();
    }
}

Однако при инициализации streamSource выдается исключение:

fileName = "file: ///mnt/sdcard/Alien/PlayersBase.btb"

и исключение

"System.IO.DirectoryNotFoundException: не удалось найти часть пути"/file:///mnt/sdcard/Alien/PlayersBase.btb" ................."

Я бы понял, если бы у меня не было прав на некоторые папки, но почему говорится, что папка не существует, когда это именно тот файл, который я выбрал в проводнике?

0 ответов

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