ImageCell не отображает изображение только на Android - PullRequest
1 голос
/ 03 октября 2019

Я пытался заставить ImageCell показывать изображение в очень простом ListView в течение некоторого времени, используя библиотеку Shared. Проблема появляется ТОЛЬКО на Android, версия для iOS работает так, как задумано.

PS: У меня тоже проблемы с загрузкой изображений из интернета, опять же только для Android. Я уверен, что проблема та же. Я уже добавил Интернет-разрешение в манифест и попробовал все различные варианты реализации 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 Ответ

2 голосов
/ 03 октября 2019

Ваша проблема связана с ограничениями в более поздних версиях Android с небезопасными (http) подключениями.

Если вы отладите приложение и посмотрите на Вывод, вы увидите следующее сообщение:

Загрузка изображения: ошибка при получении потока для http://lorempixel.com/100/100/people/1: Java.IO.IOException: незашифрованный HTTP-трафик на lorempixel.com не разрешен в Java.Interop.JniEnvironment + InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference экземпляр, Метод Java.Interop.JniMethodInfo, Java.Interop.JniArgumentValue * args) [0x00069] in: 0 в Java.Interop.JniPeerMembers + JniInstanceMethods.InvokeAbstractVoidMethod (System.String encodedMember, Java.InJ.WeJ.InUJe .In. Java.Ingu. * параметры) [0x00014] в: 0 в Java.Net.HttpURLConnectionInvoker.Connect () [0x0000a] в: 0 в Xamarin.Android.Net.AndroidClientHandler + <> c__DisplayClass44_0.b__0 () [0x0005a] в: 0 в системе. .Tasks.Task.InnerInvoke () [0x0000f] в: 0 в System.Threading.Tasks.Task.Execute () [0x00000] in: 0 --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение ---

Как вы можете прочитать там, сообщение Cleartext HTTP traffic to lorempixel.com not permitted at

Самый быстрыйрешение состоит в том, чтобы добавить android:usesCleartextTraffic="true" на уровне приложения в файл Manifest.xml:

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

Но вышеупомянутое не рекомендуется, поскольку это открывает брешь в плане безопасности. Лучшим решением было бы использовать https в ваших URL.

enter image description here

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...