为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
青春有我 2022-12-24 12:53:40
在我们开始之前,我知道很多人提出了类似的问题,但我无法解决我的问题。我尝试将位图保存到 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”的一部分路径有什么问题?错误的根源是什么?PS:我已经给了所有需要的权限。
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超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;,您应该注意到这是一个公共外部文件。


/存储/模拟/0/文档


从文档中可以看出,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包给项目申请权限。如下示例:


创建时():


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);

}

其他解决方案:


如果不使用公共外部文件,您可以尝试使用私有外部文件


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


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


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


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信