Проблема с загрузкой изображений Picasso в Android 9.0 Pie

Я не могу загружать изображения с помощью библиотеки Picasso в Android 9.0 Pie. На самом деле, он отлично работает для версий ниже. Сообщение об ошибке не отображается. Кто-то поделился своими журналами на Github, используя

Picasso.get().setLoggingEnabled(true);

У него есть журнал сообщений:

2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: initViewContentFetcherClass
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: ViewContentFetcher : ViewContentFetcher
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: createInterceptor took 0ms
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Catcher list invalid for [email protected]@147874166
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Get featureInfo from config pick_mode
2018-10-19 13:13:20.485 24840-24840/com.xyz.test.testpicasso D/Picasso: Main        created      [R1] Request{https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png}
2018-10-19 13:13:20.492 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  enqueued     [R1]+6ms 
2018-10-19 13:13:20.492 24840-24866/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+7ms 
2018-10-19 13:13:20.555 1531-1684/? I/ActivityManager: Displayed com.xyz.test.testpicasso/.MainActivity: +114ms
2018-10-19 13:13:20.555 5475-5603/? D/PowerKeeper.Event: notifyActivityLaunchTime: com.xyz.test.testpicasso/.MainActivity totalTime: 114
2018-10-19 13:13:20.709 735-816/? W/SurfaceFlinger: Attempting to set client state on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.710 735-816/? W/SurfaceFlinger: Attempting to destroy on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.775 1531-1684/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{821c51 u0 com.xyz.test.testpicasso/.MainActivity t4372} time:9356677
2018-10-19 13:13:21.003 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+518ms 
2018-10-19 13:13:21.004 24840-24872/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+519ms 
2018-10-19 13:13:21.513 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+1027ms 
2018-10-19 13:13:21.514 24840-24877/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+1028ms 
2018-10-19 13:13:21.516 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  batched      [R1]+1030ms for error
2018-10-19 13:13:21.717 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  delivered    [R1]+1232ms

попробуйте использовать android: usesCleartextTraffic = "true" в теге приложения в манифесте

Intsab Haider 04.11.2018 11:21

Эй, ты спас мне день ... Большое тебе спасибо

tejraj 04.11.2018 11:48

Не могли бы вы указать причину этого?

tejraj 04.11.2018 11:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
3
10 620
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте использовать android:usesCleartextTraffic = "true" в теге приложения вашего файла манифеста! Поскольку я столкнулся с той же проблемой, используя Android Volley!

Согласно документации Android

Indicates whether the app intends to use cleartext network traffic, such as cleartext HTTP. The default value for apps that target API level 27 or lower is "true". Apps that target API level 28 or higher default to "false".

When the attribute is set to "false", platform components (for example, HTTP and FTP stacks, DownloadManager, MediaPlayer) will refuse the app's requests to use cleartext traffic. Third-party libraries are strongly encouraged to honor this setting as well. The key reason for avoiding cleartext traffic is the lack of confidentiality, authenticity, and protections against tampering: a network attacker can eavesdrop on transmitted data and also modify it without being detected. link

Разрешить HTTP-трафик в современном приложении - не лучшая идея. Это может привести к множеству проблем с безопасностью (кроме причины отладки). По крайней мере, вам нужно ограничить домен, как в ответе @QuentinKlein. А для полной поддержки вы можете проверить здесь

Antoine Draune 09.08.2019 16:27

@Intsab Haider Спасибо за ответ. У меня тоже работает

dev_mg99 20.09.2019 09:45

В этом ответе я отправил правку для обновления документации Android. На уровне API 28 или выше значение по умолчанию становится ложным.

John Pang 09.10.2019 17:13

Я знаю, что ответ с android:usesCleartextTraffic = "true" работает, но это позволит всем соединениям быть http не с для всего, что, я полагаю, не то, что вы хотите в 2018 году.

Если вы знаете домен, к которому вы обращаетесь в http, и у вас есть верь этому, тогда лучше использовать конфигурация сетевой безопасности.

Определите XML-файл в res/xml/network_security_config.xml

<?xml version = "1.0" encoding = "utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted = "true">
        <domain includeSubdomains = "true">secure.example.com</domain>
    </domain-config>
</network-security-config>

См. cleartextTrafficPermitted = "true" только для secure.example.com и его сабвуферов.

А затем в вашем AndroidManifest.xml добавьте android:networkSecurityConfig = "@xml/network_security_config"

Вы можете добавить несколько доменов с несколькими конфигурациями, убедитесь, что некоторые из них являются https или наоборот. ИМХО выглядит более защищенным.

В моем случае я просто изменил URL-адрес изображения с http на https, и он работал с API 28, ничего не добавляя в мой файл манифеста.

Приложения, нацеленные на уровень API 28 или выше, по умолчанию android: для параметра usesCleartextTraffic установлено значение «false».

John Pang 09.10.2019 17:31

Другие вопросы по теме

Похожие вопросы