Android中的“找不到路径的一部分”错误

Posted

技术标签:

【中文标题】Android中的“找不到路径的一部分”错误【英文标题】:“Could not find a part of the path” error in Android 【发布时间】:2019-09-11 17:39:34 【问题描述】:

在我们开始之前,我知道很多人发布了类似的问题,但我无法解决我的问题。

我尝试将位图保存到 android 设备的图库中,但无法到达该特定路径。

代码如下:

string root = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
Java.IO.File myDir = new Java.IO.File(root + "/Screenshots");
myDir.Mkdirs();

string fname = "test_picture.jpg";

Java.IO.File file = new Java.IO.File(myDir, fname);
if (file.Exists())
    file.Delete();
try

    FileStream outStream = new FileStream(file.Path, FileMode.OpenOrCreate); //Seems like the problem is here
    finalBitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, outStream);
    outStream.Flush();
    outStream.Close();

catch (Exception e)

    Toast.MakeText(Activity, e.ToString(), ToastLength.Long).Show();

我得到这个错误:

System.IO.DirectoryNotFoundException:找不到路径“/storage/emulated/0/Screenshots/test_picture.jpg”的一部分

路径有什么问题?错误的根源是什么?

P.S:我已授予所有需要的权限。

【问题讨论】:

代码是否创建了文件夹“/Screenshots”? @jdweng 我不知道应该在哪里找到它,因为我没有进入 storage\emulated\0.. 的权限。为什么系统不直接进入 sdCard 路径? 如果您没有权限手动转到文件夹,为什么您认为您的 c# 代码可以访问同一文件夹? @jdweng 这就是重点。为什么我无法进入 sdCard 路径? 看看以下是否有帮助。它在智能卡上使用读/写 XML 文件,但相同的规则应适用于任何文件。 ***.com/questions/27396592/… 【参考方案1】:

我收到下一个错误:System.IO.DirectoryNotFoundException:找不到路径“/storage/emulated/0/Screenshots/test_picture.jpg”的一部分。

测试你的代码后,下面的代码会出现这个错误:

FileStream outStream = new FileStream(file.Path, FileMode.OpenOrCreate);

如果使用这个 string root = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; ,你应该注意到这是一个 Public external files 。

/storage/emulated/0/Documents

从文档中,Android 应用必须获得权限才能读取或写入任何公共文件。 所以这里你需要在AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

并且从android 6.0开始,还需要添加runtimer权限。这里,建议可以为项目安装Plugin.Permissions NuGet包来请求权限。如下示例:

OnCreate():

Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this,savedInstanceState);

按钮点击方法():

try

    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
    if (status != PermissionStatus.Granted)
    
        if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Storage))
        
            //await DisplayAlert("Need location", "Gunna need that location", "OK");
            Console.WriteLine("OK");
        

        var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage);
        //Best practice to always check that the key exists
        if (results.ContainsKey(Permission.Storage))
            status = results[Permission.Storage];
    

    if (status == PermissionStatus.Granted)
    
        string root = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
        Java.IO.File myDir = new Java.IO.File(root + "/Screenshots");
        myDir.Mkdirs();

        string fname = "test_picture.jpg";

        Java.IO.File file = new Java.IO.File(myDir, fname);
        Console.WriteLine("------root-------" + file.Path);

        FileStream outStream = new FileStream(file.Path, FileMode.OpenOrCreate);
        ....
    
    else if (status != PermissionStatus.Unknown)
    
        Console.WriteLine("OK");
        //await DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
    

catch (Exception ex)

    Console.WriteLine("" + ex);

其他解决方案:

如果不使用公共外部文件,你可以试试Private external files

/storage/emulated/0/Android/data/com.companyname.app/files/

这不需要运行时权限。但也需要AndroidManifest.xml 中的静态权限。

string root = Application.Context.GetExternalFilesDir("DirectoryPictures").ToString();

【讨论】:

以上是关于Android中的“找不到路径的一部分”错误的主要内容,如果未能解决你的问题,请参考以下文章

创建互斥锁时出现“找不到路径的一部分”错误

发布 .NET Core 应用程序时出现错误“找不到路径的一部分”

在单元测试用例的 TFS 构建中找不到路径的一部分

无法复制文件,找不到路径的一部分

C# 获取 %AppData% 的路径

Java(Android)中的新功能。为啥 ANT DEBUG 显示错误“找不到符号”?