Ошибка «Не удалось найти часть пути» в Android - PullRequest
1 голос
/ 22 апреля 2019

Перед тем, как мы начнем, я знаю, что многие отправили похожие вопросы, но я не могу решить мою проблему.

Я пытаюсь сохранить растровое изображение в галерее устройства 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 Ответ

2 голосов
/ 23 апреля 2019

Я получаю следующую ошибку: 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; вы должны заметить, что это Публичные внешние файлы .

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

Другое решение:

Если вы не используете Публичные внешние файлы , вы можете попробовать Личные внешние файлы

/ хранилище / эмуляция / 0 / Android / data / com.companyname.app / files /

Это не нужнотребуется разрешение во время выполнения. Однако статическое разрешение в AndroidManifest.xml также необходимо.

string root = Application.Context.GetExternalFilesDir("DirectoryPictures").ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...