ImageCell仅在Android上不显示图像

时间:2019-10-03 07:06:20

标签: xamarin xamarin.forms xamarin.android

一段时间以来,我一直在尝试使用共享库让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; }
}

1 个答案:

答案 0 :(得分: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 at   System.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

希望这会有所帮助