【问题标题】:Showing downloaded image in ImageView not working in Xamarin.Android在 ImageView 中显示下载的图像在 Xamarin.Android 中不起作用
【发布时间】:2021-02-02 23:38:28
【问题描述】:

我有一个小的 png 图像,我喜欢使用 Xamarin.Android 在 imageview 中显示。 我正在使用以下代码下载文件:

private void Download()
{
    var url = "https://hns.d7u.de/v4/images/hvvstoerungen_facebook.png";
    var directory = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/myapp/";
    var fileName = url.Substring(url.LastIndexOf("/") +1);
    var path = directory + fileName;
    System.Net.WebClient wC = new System.Net.WebClient();
    wC.Headers.Add(System.Net.HttpRequestHeader.AcceptEncoding, "gzip");
    wC.DownloadDataCompleted += WC_DownloadDataCompleted;
    wC.DownloadDataAsync(new Uri(url), path);
}

private void WC_DownloadDataCompleted(object sender, System.Net.DownloadDataCompletedEventArgs e)
{
    var path = e.UserState.ToString();
    var bytes = e.Result;
     if (File.Exists(path))            
        File.Delete(path);
     if (!File.Exists(path))
        File.WriteAllBytes(path, bytes);
}

它存储在 /data/user/0/myapp/files/hns/hvvstoerungen_facebook.png 并且 File.Exists(...) 为该路径返回 true。所以我确定该文件已下载并且存在。

当我想在 ImageView 中显示它时,我会这样做:

if (System.IO.File.Exists(imageFilePath))
{
    Android.Net.Uri andrUri = Android.Net.Uri.Parse(imageFilePath);
    ImageIcon.SetImageURI(andrUri);

    //Also not working:
    //Bitmap bitmap = BitmapFactory.DecodeFile(imageFilePath);
    //ImageIcon.SetImageBitmap(bitmap);

    //And also not working:
    //Android.Net.Uri andrUri = Android.Net.Uri.Parse(imageFilePath);
    //Bitmap bmp = BitmapFactory.DecodeStream(Android.App.Application.Context.ContentResolver.OpenInputStream(andrUri));
    //ImageIcon.SetImageBitmap(bmp);
}

当应该显示图像时,输出窗口会显示以下内容:

02-01 23:41:24.770 E/Drawable(19815):无法解码流: android.graphics.ImageDecoder$DecodeException:创建图像失败 带有消息“未实现”输入的解码器包含错误。 02-01 23:41:24.770 W/ImageView(19815):resolveUri 在错误的位图 uri 上失败: /data/user/0/myapp/files/hns/hvvstoerungen_facebook.png

但我无法弄清楚这到底意味着什么。 另外一件事是:如果我在全新的 Android Emulator 实例中运行应用程序,则不会显示此图像和所有其他类型的图像。 如果我在旧的 Android Emulator 实例中运行该应用程序,该应用程序之前已经在 Android.Forms 基础上运行,则会显示旧项目已知的旧图像,而新下载的图像则不显示。所有图片都在同一个文件夹中,我看不出它们之间有什么区别。

有人有想法吗?

编辑: 我的工作版本有以下 Download() 方法:

private void Download()
{
    var noCompression = new string[] { ".png", ".jpg", ".jpeg", ".gif", ".zip", ".7z", ".mp3", ".mp4" };
    var url = "https://hns.d7u.de/v4/images/hvvstoerungen_facebook.png";
    var directory = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/myapp/";
    var fileName = url.Substring(url.LastIndexOf("/") +1);
    var path = directory + fileName;
    System.Net.WebClient wC = new System.Net.WebClient();
    if (!noCompression.Contains(url.Substring(url.LastIndexOf('.'))))
        wC.Headers.Add(System.Net.HttpRequestHeader.AcceptEncoding, "gzip");
    wC.DownloadDataCompleted += WC_DownloadDataCompleted;
    wC.DownloadDataAsync(new Uri(url), path);
}

【问题讨论】:

  • 注意:问题出在这一行:wC.Headers.Add(System.Net.HttpRequestHeader.AcceptEncoding, "gzip");。如果我删除它,图像显示没有任何问题。

标签: xamarin.android


【解决方案1】:

你可以试试下面的代码。

从网址下载图片:

public Bitmap GetImageBitmapFromUrl(string url)
    {
        Bitmap imageBitmap = null;

        using (var webClient = new WebClient())
        {
            var imageBytes = webClient.DownloadData(url);
            if (imageBytes != null && imageBytes.Length > 0)
            {
                imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
            }
        }

        return imageBitmap;
    }

用法:

 bitmap = GetImageBitmapFromUrl("https://hns.d7u.de/v4/images/hvvstoerungen_facebook.png");

并将图片另存为png:

 void ExportBitmapAsPNG(Bitmap bitmap)
    {
        var folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        filePath = System.IO.Path.Combine(folderPath, "test.png");
        var stream = new FileStream(filePath, FileMode.Create);
        bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
        stream.Close();
    }

用法:

ExportBitmapAsPNG(bitmap);     

检查文件是否存在并设置到imageview中:

  if (File.Exists(filePath))
        {               
            Bitmap myBitmap = BitmapFactory.DecodeFile(filePath);
            imageview.SetImageBitmap(myBitmap);
        }

【讨论】:

  • 谢谢你,这改变了!喜欢我之前不要忘记删除当前存在的文件。
  • 其实我也发现了我原来代码的问题出在哪里:gzip编码的Header。如果我删除它,我在问题中的代码也可以工作。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多