Попытка чтения с SD-карты вызывает UnauthorizedAccessException

Я создаю приложение для 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-карты?

Спасибо!


person Alfie Woodland    schedule 05.10.2015    source источник
comment
Похоже на то, что stackoverflow.com/questions/31746787/ может вам помочь.   -  person Jas    schedule 05.10.2015
comment
Спасибо - оказалось, что моя проблема заключалась только в открытии потока в режиме ReadWrite, а не в режиме Read.   -  person Alfie Woodland    schedule 05.10.2015


Ответы (1)


Проблема была вызвана этой строкой:

using (FileStream fs = File.Open(path, FileMode.Open))

Я должен был добавить третий аргумент, чтобы указать режим чтения, а не чтение/запись по умолчанию:

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
person Alfie Woodland    schedule 05.10.2015