Я создаю приложение для Android с помощью Xamarin, и мне нужно разрешить пользователям выбирать изображение JPEG со своего устройства и загружать его. Процесс охватывает несколько разных классов и включает в себя множество проверок, которые я здесь исключил, но суть в следующем:
private void ChooseImage()
{
// Open the image picker
Intent intent = new Intent(Intent.ActionGetContent);
intent.SetType("image/jpg");
_activity.StartActivityForResult(intent, (int)ImageRequest.ChooseImage);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
string path;
Android.Net.Uri selectedImage = data.Data;
string[] filePathColumn = { MediaStore.MediaColumns.Data, MediaStore.MediaColumns.DisplayName };
using (ICursor cursor = ContentResolver.Query(selectedImage, filePathColumn, null, null, null))
{
// Get the path to the selected file
path = cursor.GetString(columnIndex);
}
using (FileStream fs = File.Open(path, FileMode.Open))
{
byte[] bytes = new byte[fs.Length];
// This throws an UnauthorizedAccessException
fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
UploadImage(bytes);
}
}
У меня также установлены необходимые разрешения в AndroidManifest:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Этот код вызывает следующее исключение, если пользователь выбирает изображение на SD-карте, а не в локальном хранилище:
System.UnauthorizedAccessException: Access to the path "/storage/sdcard1/[user selected image].jpg" is denied.
Итак... Почему у меня нет разрешения на чтение с SD-карты?
Спасибо!