Почему не отрисовывается изображение?
Скачиваю изображения через WorkManager и возвращаю пути до них в директории, проблема в том, что не отрисовывается изображение, хотя метод вызывается, и я получаю логи элементов списка. Вот код:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val downloadRequest = OneTimeWorkRequestBuilder<DownloadWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(
NetworkType.CONNECTED
)
.build()
)
.build()
val workManager = WorkManager.getInstance(applicationContext)
setContent {
MyApplicationTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
val navcontroller = rememberNavController()
val workInfos = workManager
.getWorkInfosForUniqueWorkLiveData("download")
.observeAsState()
.value
val downloadInfo = remember(key1 = workInfos) {
workInfos?.find { it.id == downloadRequest.id }
}
val downloadUri = downloadInfo?.outputData?.getStringArray(WorkerKeys.IMAGE_URI)
?.toList()
NavHost
if (!(downloadInfo?.state?.name == "SUCCEEDED")) {
CircularProgressIndicator()
}else{
maket(
downloadUri, workManager = workManager,
downloadInfo = downloadInfo, downloadRequest = downloadRequest
)
}
workManager
.beginUniqueWork(
"download",
ExistingWorkPolicy.KEEP,
downloadRequest
)
//.then(colorFilterRequest)
.enqueue()
}
}
}
}
@Composable
fun maket(liveData: List<String>? = null, workManager : WorkManager,
downloadInfo : WorkInfo?, downloadRequest : OneTimeWorkRequest){
LazyColumn(
modifier = Modifier.fillMaxSize(),
) {
//list?.let { list ->
//if (liveData != null) {
items(liveData!!) {
// Log.d("fsf", it)
Row(modifier = Modifier.fillMaxSize()) {
//liveData?.let {
Image(
painter = rememberImagePainter(
data = it.toUri()//imageUri
),
contentDescription = null
)
Log.d("fsfds", it.toString())
Image(
painter = rememberImagePainter(data = it.toUri()),
contentDescription = null
)
}
// }
}
// }
//}
}
}
А вот workManager:
class DownloadWorker(
private val context: Context,
private val workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
private suspend fun startForegroundService() {
ForegroundInfo(
Random().nextInt(),
NotificationCompat.Builder(context, "download_channel")
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentText("Downloading...")
.setContentTitle("Download in progress")
//.setChannelId("download_channel")
.build()
)
}
override suspend fun doWork(): Result {
var response : retrofit2.Response<List<String>>
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService()
// }
//ResuldDownload.Success
delay(5000L)
return withContext(Dispatchers.IO) {
var id = 0
val ListImageUri = mutableListOf<String>()
var ListUrl = listOf<String>()
Log.d("dfgfd", ListUrl.toString())
response = ImageApi.instance.downloadImageUrl()
Log.d("gdfgfd", response.code().toString())
response.body()?.let {
ListUrl = it
Log.d("dfgfd", ListUrl.toString())
}
for (i in ListUrl) {
id++
var responseImage : retrofit2.Response<ResponseBody>
try {
responseImage = ImageApi.instance.downloadImages(i)
}catch (e : ConnectException){
continue
}
// delay(2000L)
//Log.d("sfsd", "sdfsd")
if (!responseImage.code().toString().startsWith("4")
&& !responseImage.code().toString().startsWith("5")) {
Log.d("sdfsdf", responseImage.code().toString())
val file = File(context.cacheDir, "image$id.jpg")
val outputStream = FileOutputStream(file)
outputStream.use { stream ->
try {
stream.write(responseImage.body()?.bytes())
Log.d("fsfsd", stream.toString())
} catch (e: IOException) {
return@withContext Result.failure(
workDataOf(
WorkerKeys.ERROR_MSG to e.localizedMessage
)
)
}
}
ListImageUri.add(file.toURI().toString())
WorkerKeys.LIST_URI = ListImageUri.toTypedArray()
}
}
// WorkerKeys.ISDOWNLOAD = false
Result.success(
workDataOf(WorkerKeys.IMAGE_URI to WorkerKeys.LIST_URI)
//workDataOf(
//WorkerKeys.IMAGE_URI to WorkerKeys.LIST_URI)
)
}
if(!response.isSuccessful) {
if(response.code().toString().startsWith("5")) {
return Result.retry()
}
return Result.failure(
workDataOf(
WorkerKeys.ERROR_MSG to "Network error"
)
)
}
return Result.failure(
workDataOf(WorkerKeys.ERROR_MSG to "Unknown error")
)
}
}
Ответы (1 шт):
Автор решения: Lnight
→ Ссылка
У меня была подобная проблема. Я получал данные с api, и у меня никак не отрисовывались картинки. После проведенных исследований я увидел, что url картинок был с http протоколом (пример: http://forkify-api.herokuapp.com/images/best_pizza_dough_recipe1b20.jpg). Мне пришлось прописать это в своём application в манифесте чтоб разрешить соединение через http:
android:usesCleartextTraffic="true"
P.S. Не судите строго если ответ будет неправильным. Я новичок, но хотел помочь.