Lee Evans
Lee Evans

Reputation: 81

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

I am trying to write an image to my android file system, however when trying to write the bytes, I get the above error.

I am running Visual Studio 2019 (as administrator) and targeting API Level 29

AndroidManifest.xml

My external storage permissions are present in my manifest file:

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

And as per another suggestion I have added android:requestLegacyExternalStorage="true" in my application tag:

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

MainActivity.cs

Here I am requesting the permissions when the app starts and pressing allow on both prompts:

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

I get the error on 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;

}

I am at a bit of a loss on what to try next as to me it seems that I should have the necessary permissions to write a file to a folder on the device. I have also tried various locations to save to and methods of saving with the same result.

Thanks in advance

Upvotes: 0

Views: 822

Answers (1)

SushiHangover
SushiHangover

Reputation: 74144

You are trying to write to a directory as you are throwing away the return value from Path.Combine :

Path.Combine(path, fileName);

Try:

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

Upvotes: 2

Related Questions