У меня есть этот URL-адрес https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3
. На этом URL-адресе есть изображение PNG в хранилище BLOB-объектов, доступное без каких-либо заголовков (обычно) в REST API. Обычно он открывается из веб-браузера (например, Chrome). Однако любая попытка загрузить его в приложение Java Android для ImageView с треском проваливается. Я пробовал Volley, Picasso, Glide, Retrofit и ручные методы. Я включаю код, который я пробовал. Самое близкое, что у меня есть, выдает это сообщение об ошибке D/skia: --- Failed to create image decoder with message 'unimplemented'
. Проблема в том, что тип контента image/png
, но я не могу его нигде указать, а поскольку URL-адрес не содержит никакого расширения, его довольно проблематично декодировать. Если вы запустите запрос GET через клиент API (например, Postman), он вернет файл PNG.
Такая же проблема присутствует с этим URL https://speakyfox-api-qa.herokuapp.com/api/v1/files/7b6f4529-256f-43a4-ac45-8613d96c505e
. Он содержит короткий файл MP3, который я хочу поместить в объект MediaPlayer.
Прежде чем кричать, что это однострочник, я был бы признателен, если бы вы попытались отобразить изображение в ImageView. Проблема в том, что ссылка предназначена для html, а не непосредственно для данных.
// Getting reference to ImageView object
ImageView imageView = (ImageView)findViewById(R.id.imageView);
// Loading using Picasso
Picasso.get().load("https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3").into(imageView);
// Loading using Glide
Glide.with(MainActivity.this).load("https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3").into(imageView);
// Loading using HttpURLConnection/InputStream/Bitmap executed in Async task
java.net.URL url = new java.net.URL("https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
imageView.setImageBitmap(myBitmap);
// Using Volley [ImageRequest]
RequestQueue queue = Volley.newRequestQueue(this);
ImageRequest request = new ImageRequest("https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, null){
/** Passing some request headers* */
@Override
public Map getHeaders() {
HashMap headers = new HashMap();
headers.put("Content-type","image/png");
return headers;
}
queue.add(request);
// Using Volley [NetworkImageView]
NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(10);
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
});
networkImageView.setImageUrl("https://speakyfox-api-qa.herokuapp.com/api/v1/files/be28dcec-4912-4f58-8cb8-12b9b2948fc3", mImageLoader);
// Using Volley [StringRequest]
RequestQueue queue = Volley.newRequestQueue(this);
StringRequest getRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
byte[] decodedString = Base64.decode(response, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
imageView.setImageBitmap(decodedByte);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {}
}) {
/** Passing some request headers* */
@Override
public Map getHeaders() {
HashMap headers = new HashMap();
headers.put("Content-type","image/png");
return headers;
}
};
queue.add(getRequest);
Этот код, однако, работает (но уродлив)...
WebView webView = findViewById(R.id.webview);
webView.loadUrl("https://speakyfox-api-qa.herokuapp.com/api/v1/files/7b6f4529-256f-43a4-ac45-8613d96c505e");
Тем не менее, мне нужно заставить его работать с ImageView.
РЕДАКТИРОВАТЬ: я попытался загрузить файл с помощью OkHttp, используя этот код
Request request = new Request.Builder().url(url).addHeader("Content-Type", "image/png").build();
OkHttpClient client = new OkHttpClient();
Call call = client.newCall(request);
call.enqueue(new Callback() {
public void onResponse(Call call, Response response) throws IOException {
Log.e("",response.body().string());
}
public void onFailure(Call call, IOException e) {}
});
Тело ответа
{"code":{"group":3,"internalCode":200,"statusCode":200},"data":{"type":"Image","imageType":"Whole","name": «Я и ты». :44:20.468276Z"}}
Content-type
? Если нет, добавьте это, и это должно решить вашу проблему. - person CommonsWare   schedule 03.12.2019