代码之家  ›  专栏  ›  技术社区  ›  Daniel Reyhanian

在Android中找不到部分路径错误

  •  0
  • Daniel Reyhanian  · 技术社区  · 6 年前

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

    代码如下:

    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:我已经给了所有需要的权限。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Junior Jiang    6 年前

    我得到下一个错误: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 .

    /存储/模拟/0/文档

    从文件中, 所以你需要在这里添加权限 AndroidManifest.xml

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

    从android 6.0中,您还需要添加runtimer权限 插件.权限 项目请求权限的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

    /存储/模拟/0/Android/data/com.companyname.app/files/

    这不需要运行时权限。但是 AndroidManifest.xml文件 也需要。

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