ImageCell仅在Android上不显示图像

问题描述 投票:1回答:1

一段时间以来,我一直在尝试使用共享库让ImageCell在非常基本的ListView中显示图像。该问题仅在Android上出现,iOS版本可正常使用。

PS:我也无法从Internet加载图像,同样仅适用于Android。我敢肯定问题是相同的。我已经在清单中添加了Internet权限,并尝试了所有不同的HttpClientImplementation和SSL / TLS实现选项。

我的XAML如下:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TestXamarin.GreetPage">
    <ListView x:Name="listView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell Text="{Binding Name}" Detail="{Binding Status}" ImageSource="{Binding ImageUrl}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
        
</ContentPage>

类背后的代码是这样的:

public partial class GreetPage : ContentPage
{
    public GreetPage()
    {
        On<iOS>().SetUseSafeArea(true);

        InitializeComponent();

        listView.ItemsSource = new List<Contact>
        {
            new Contact { Name="John", ImageUrl = "http://lorempixel.com/100/100/people/1" },
            new Contact { Name="Jack", ImageUrl = "http://lorempixel.com/100/100/people/2", Status="Hello guys" },
            new Contact { Name="Jill", ImageUrl = "http://lorempixel.com/100/100/people/3" }
        };
    }       
}

Contact.cs类是这样:

public class Contact
{
    public string Name { get; set; }
    public string Status { get; set; }
    public string ImageUrl { get; set; }
}
xamarin xamarin.forms xamarin.android
1个回答
2
投票

您的问题与具有非安全(http)连接的更高版本的Android的限制有关。

如果您调试应用程序并查看输出,您将看到如下消息:

图像加载:获取流的错误http://lorempixel.com/100/100/people/1:Java.IO.IOException:明文不允许通过lorempixel.com进行HTTP流量Java.Interop.JniEnvironment + InstanceMethods.CallVoidMethod(Java.Interop.JniObjectReference实例,Java.Interop.JniMethodInfo方法,Java.Interop.JniArgumentValue * args)[0x00069]在:0处Java.Interop.JniPeerMembers + JniInstanceMethods.InvokeAbstractVoidMethod(System.String编码的成员,Java.Interop.IJavaPeerable自我,Java.Interop.JniArgumentValue *参数)[0x00014]在:0处Java.Net.HttpURLConnectionInvoker.Connect()[0x0000a]在:0处Xamarin.Android.Net.AndroidClientHandler + <> c__DisplayClass44_0.b__0()[0x0005a] in:0 atSystem.Threading.Tasks.Task.InnerInvoke()[0x0000f]在:0处System.Threading.Tasks.Task.Execute()[0x00000]在0:---从先前引发异常的位置开始的堆栈跟踪---

如您所见,有消息说Cleartext HTTP traffic to lorempixel.com not permitted at

最快的解决方案是在Manifest.xml文件的应用程序级别添加android:usesCleartextTraffic="true"

<application android:label="MyApp.Android" android:usesCleartextTraffic="true">
    ...
</application>

但是以上内容不建议这样做,因为它在安全性方面存在漏洞。最好的解决方案是在Urls中使用https

enter image description here

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.