Xamarin android 显示来自外部存储的图像

Xamarin android display image from external Storage

我目前正在尝试显示存储中的图像,但没有成功。

我在做什么。

  public Stream ReadImage(string path) 
    {

        //var uri = Android.Net.Uri.Parse(path);
        //var stream = MainActivity._activity.ContentResolver.OpenInputStream(uri);
        //return stream;
        var memoryStream = new MemoryStream();

        using (var source = System.IO.File.OpenRead(path))
        {
            source.CopyTo(memoryStream);
        }

        return memoryStream;
    }

字符串路径 = "/storage/emulated/0/DCIM/Camera/IMG_20190521_094202.jpg"

     var imageSource = ImageSource.FromStream(
            delegate { 
                return DependencyService.Get<IMediaHelper>().ReadImage(path);
            });

但是在 using 行中,程序没有继续,它没有到达以下行,也没有从存储中加载文件,contetn 解析器的方式确实以相同的方式结束,在 contentresolver 行中.

我有Read/write外部存储权限。

我正在使用 android x,Xamarin 5.0.0.2012。在android 10 & 和 11 下,在多个不同的小米设备上。

这可能是一个错误,因为我想,我在早期的项目中有它 运行。

一些见解将不胜感激,我正在努力解决这个问题。

为了让用户更好地控制他们的文件并限制文件混乱,面向 Android 10(API 级别 29)及更高级别的应用程序被授予对外部存储或范围存储的范围访问权限, 默认。此类应用只能访问外部存储上的应用特定目录,以及应用拥有的特定类型的媒体 created.You 可以读取它 here.

对于 android 10,您可以在 AndroidManifest.

中的 Application 标签中请求 requestLegacyExternalStorage 属性
<application android:label="NewForms.Android" android:resizeableActivity="true" android:requestLegacyExternalStorage="true" android:theme="@style/MainTheme"> 

对于android11,需要在AndroidManifest中添加<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />,并在Activity中判断权限是否开启。

并且不能忘记动态申请WRITE_EXTERNAL_STORAGE权限(这是Android6.0之后添加的,命名为Runtime Permissions)。

最终代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.newforms" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="30" />
<application android:label="NewForms.Android" android:requestLegacyExternalStorage="true" android:theme="@style/MainTheme"></application>   
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

</manifest>

您可以在 MainActivity:

中请求 runtime permission like this
RequestPermissions(new string[] { Manifest.Permission.WriteExternalStorage}, 0);
if (Build.VERSION.SdkInt > BuildVersionCodes.Q)
      {
          if (!Environment.IsExternalStorageManager)
          {
             StartActivityForResult(new Intent( Android.Provider.Settings.ActionManageAllFilesAccessPermission), 101);
          }
      }