Я выполнил инструкцию на странице «Дооснащение», чтобы загрузить изображение, однако без тега @Streaming входной поток (буфер) будет немедленно равен -1, показывая файл пустым. (изображение довольно мало, всего несколько сотен kb) Даже когда я использую тег @Streaming, приложение будет продолжать сбой, когда я использую входной поток из-за IllegalStateException.Загрузить изображения с помощью Retrofit return empty file
Я пробовал HttpConnection, и я мог загрузить изображение просто хорошо. Тем не менее, я действительно хочу, чтобы заставить его работать с Модернизированный
public static String downloadImage(String bearer, long pictureId,Context context){
String path = "";
NetworkAPI apiService = NetworkClient.getClient().create(NetworkAPI.class);
//Call<ResponseBody> downloadCall = apiService.downloadImage(bearer,pictureId);
Call<ResponseBody> downloadCall = apiService.downloadFileWithDynamicUrlSync("https://androidtutorialpoint.com/api/RetrofitAndroidImageResponse");
try {
Response<ResponseBody> response = downloadCall.execute();
if(response.isSuccessful()) {
Log.d(TAG, "success download" + response.body().string());
Log.d("DownloadImage", "Reading and writing file");
InputStream in = null;
OutputStream out = null;
try {
in = response.body().byteStream();
File file = PictureUtil.createImageFile(context);
Uri photoURI = FileProvider.getUriForFile(context,
"vn.com.wk.bradleyaudit.fileprovider",
file);
out = new FileOutputStream(file);
long fileSize = response.body().contentLength();
long downloadedSize = 0;
Log.d("DownloadImage", "size"+fileSize);
byte[] buffer = new byte[4096];
while (true) {
int bufferLength = in.read(buffer);
Log.d("DownloadImage", "buffer Length"+bufferLength);
if (bufferLength == -1) {
break;
}
out.write(bufferLength);
out.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
}
out.flush();
path = photoURI.toString();
Log.d("DownloadImage", "path"+path);
}
catch (IOException e) {
Log.d("DownloadImage",e.toString());
}
finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return path;
}
Почему вы используете модифицировать для изображений? Дооснащение - хороший выбор для клиентов api для отдыха, но для изображений скольжения или пикассо было бы лучше. –
использовать picasso вместо retrofit – raj
Я использую Glide для моего проекта. Однако я также хочу сохранить изображение во внутреннем хранилище (чтобы сделать это с помощью Glide или Picasso, мне нужно сохранить файл кеша после загрузки). Кроме того, я хочу выяснить, почему этот код не работает. Я не знаю, где я ошибся –