Директория не найдена исключение после выбора файла в проводнике
РЕДАКТИРОВАТЬ: Я провел некоторые исследования и важно для моего вопроса это:
Я использую объект 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" ................."
Я бы понял, если бы у меня не было прав на некоторые папки, но почему говорится, что папка не существует, когда это именно тот файл, который я выбрал в проводнике?