Проблема с загрузкой изображения 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

Ответ 1

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

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

Указывает, намерено ли приложение использовать сетевой трафик в виде открытого текста, например HTTP в виде открытого текста. Значением по умолчанию для приложений, предназначенных для уровня API 27 или ниже, является "true". Приложения, для которых уровень API 28 или выше, по умолчанию имеют значение "false".

Когда для атрибута установлено значение "false", компоненты платформы (например, HTTP) и стеки FTP, DownloadManager, MediaPlayer) откажутся от приложения просит использовать трафик открытым текстом. Сторонние библиотеки сильно Рекомендуется также соблюдать эту настройку. Основная причина избегать трафик открытого текста - это отсутствие конфиденциальности, подлинности и защита от взлома: сетевой злоумышленник может подслушать переданные данные, а также изменить их без обнаружения. ссылка

Ответ 2

Я знаю, что ответ с 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 или наоборот. Выглядит более защищенным ИМХО.

Ответ 3

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