2015-10-05 104 views
2

我正在用Xamarin构建一个Android应用程序,并且需要允许用户从他们的设备中选择一个JPEG图像并上传它。该过程跨越几个不同的类别,涉及了很多检查,我会在这里排除的,但是这是它的要点:试图从SD卡读取引发UnauthorizedAccessException

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卡?

谢谢!

+0

好像HTTP:// stackoverflow.com/questions/31746787/xamarin-android-system-unauthorizedaccessexception-access-to-the-path-is-de可以帮助你。 – Jas

+0

谢谢 - 原来我的问题只是在ReadWrite模式下打开流而不是Read。 –

回答

3

问题是由这一行造成的:

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

我应该补充的第三个参数指定阅读模式,而不是默认的读/写:

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