Android 在文件资源管理器中拾取文件后出现目录未找到异常

Android 在文件资源管理器中拾取文件后出现目录未找到异常,android,file,xamarin.android,filepath,filepicker,Android,File,Xamarin.android,Filepath,Filepicker,编辑:我做了一些研究,重要的是我的问题是: 我使用Intent对象从用户获取文件路径。他使用一些随机文件浏览器。我安装到emulator中的一个返回如下路径: 文件名=”file:///mnt/sdcard/Alien/PlayersBase.btb" 这不管用 如果我以编程方式访问同一个文件,知道文件在哪里,我会这样做: string str = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToS

编辑:我做了一些研究,重要的是我的问题是:

我使用Intent对象从用户获取文件路径。他使用一些随机文件浏览器。我安装到emulator中的一个返回如下路径:

文件名=”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中选择一个文件,我想将该文件复制到我的应用程序的本地文件夹

我从中选择了第三个答案,允许用户在三星和非三星设备上选择文件下面的代码似乎工作正常,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会引发异常:

文件名=”file:///mnt/sdcard/Alien/PlayersBase.btb"

例外是

“System.IO.DirectoryNotFoundException:找不到路径的一部分”/file:///mnt/sdcard/Alien/PlayersBase.btb“……”


如果我没有某些文件夹的权限,我会理解,但为什么它会说文件夹不存在,而它正是我在文件资源管理器中选择的文件?

您的路径
/file:///mnt/sdcard/Alien/PlayersBase.btb“…..
/
开头,这可能是错误的原因。尝试删除第一个符号“/”只写在异常字符串中,文件名变量如我文章末尾所述,只是“file:///...“。我刚刚更新了帖子。问题是android上的文件系统,我还不太了解。文件资源管理器返回的额外符号“file://”不应该存在。如果有人能给我指出正确的方向,那就太好了,因为谷歌并不擅长查找“//”字符串。