访问路径...被拒绝 - Xamarin Android

Access to the path ... is denied - Xamarin Android

我正在尝试将图像写入我的 android 文件系统,但是在尝试写入字节时,出现上述错误。

我是 运行 Visual Studio 2019 年(作为管理员)并且目标 API 级别 29

AndroidManifest.xml

我的清单文件中有我的外部存储权限:

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

根据另一个建议,我在我的应用程序标签中添加了 android:requestLegacyExternalStorage="true"

<application android:label="App Name" android:icon="@mipmap/launcher_foreground" android:extractNativeLibs="true" android:requestLegacyExternalStorage="true">

MainActivity.cs

这里我在应用程序启动时请求权限,并在两个提示上都按允许:

int requestPermissions = 0;
string cameraPermission = Android.Manifest.Permission.Camera;
string filePermission = Android.Manifest.Permission.WriteExternalStorage;

if (!(ContextCompat.CheckSelfPermission(this, cameraPermission) == (int)Permission.Granted) || !(ContextCompat.CheckSelfPermission(this, filePermission) == (int)Permission.Granted))
        {
           ActivityCompat.RequestPermissions(this, new String[] { cameraPermission, filePermission 
        }, requestPermissions);
}

SaveMedia.cs

我在 File.WriteAllBytes 上收到错误:

public string SavePickedPhoto(Stream file, string fileName)
{
        var bytes = GetBytesFromStream(file);
        string path = Path.Combine(Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath + "PhotoDirectoryForApp";

        if (!Directory.Exists(path))
            {
                try
                {
                    Directory.CreateDirectory(path);

                }
                catch (Exception e)
                {


                }

            }
        Path.Combine(path, fileName);

        try
        {
            File.WriteAllBytes(path, bytes);

        }
        catch (Exception ex)
        {

        }

        return path;

}

我对接下来要尝试的事情有点不知所措,似乎我应该拥有将文件写入设备上的文件夹的必要权限。我也试过不同的保存位置和保存方法,结果都是一样的。

提前致谢

您正在尝试写入 目录 ,因为您正在丢弃 Path.Combine 中的 return 值:

Path.Combine(path, fileName);

尝试:

~~~
path = Path.Combine(path, fileName);
~~~