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

时间:2019-04-22 14:22:27

标签: java c# android file xamarin

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

我尝试将位图保存到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”的一部分

路径有什么问题?由于某种原因,我认为系统无法为我创建必要的目录(MkDirs())。

我已授予所有必需的权限。

1 个答案:

答案 0 :(得分:2)

  

下一个错误: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();