Проблема с загрузкой изображения 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, не добавляя ничего в мой файл манифеста.