Я получаю следующую ошибку: 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();