Android: SkImageDecoder:: Factory возвращен null
Я использую свой localhost для извлечения изображений и просмотра в ImageView. По какой-то причине я получаю Factory возвращенную ошибку null. Я много раз просматривал код, и я не понимаю, что случилось. Любая помощь будет оценена!
GalleryZoom.java
public class Zoom extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.gallery_zoom);
String selection = getIntent().getExtras().getString("image");
Toast.makeText(this, selection, Toast.LENGTH_LONG).show();
new backgroundLoader().execute();
}
private class backgroundLoader extends AsyncTask<Void, Void, Void> {
Bitmap bmp;
@Override
protected Void doInBackground(Void... params) {
bmp = DecodeBitmapSampleSize(getIntent().getExtras().getString("image"), 48, 64);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
ImageView image = (ImageView) findViewById(R.id.imageZoom);
image.setImageBitmap(bmp);
}
}
public Bitmap DecodeBitmapSampleSize (String strURL, int reqWidth, int reqHeight) {
InputStream in = null;
Bitmap bmp = null;
in = OpenHttpConnection(strURL);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeStream(in, null, options);
return bmp;
}
private InputStream OpenHttpConnection(String strURL) {
try {
URL url = new URL(strURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(connection.getInputStream());
return in;
} catch (Exception exception) {
exception.printStackTrace();
return null;
}
}
public static int calculateSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int width = options.outWidth;
final int height = options.outHeight;
int inSampleSize = 1;
if (width > reqWidth || height > reqHeight) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
}
Журнал LogCat
08-13 21:55:19.578: I/MemoryCache(3197): MemoryCache maximum limit is 6MB
08-13 21:55:19.658: I/MemoryCache(3197): cache size = 24600, length = 1
08-13 21:55:19.688: I/MemoryCache(3197): cache size = 24600, length = 1
08-13 21:55:19.708: I/MemoryCache(3197): cache size = 24600, length = 1
08-13 21:55:19.708: I/MemoryCache(3197): cache size = 24600, length = 1
08-13 21:55:20.628: I/MemoryCache(3197): cache size = 71600, length = 2
08-13 21:55:20.678: I/MemoryCache(3197): cache size = 101408, length = 3
08-13 21:55:26.228: I/MemoryCache(3197): MemoryCache maximum limit is 6MB
08-13 21:55:26.228: I/MemoryCache(3197): MemoryCache maximum limit is 6MB
08-13 21:55:26.998: D/skia(3197): --- SkImageDecoder::Factory returned null
Ответы
Ответ 1
Я столкнулся с той же проблемой. Кроме того, я уверен, что URL-адрес правильный для загрузки изображения. Отлаживая код, я обнаружил, что переменная положения во входном потоке была установлена на 1024 после первого декодирования.
Поэтому перед вторым декодированием я добавляю inputstream.reset(). Это работает.
Надежда может помочь другим.
Ответ 2
Привет, ребята, я огляделся, у меня получилось лучшее решение.
поскольку #jia George указывает, что вы отправили reset входной поток после первого декодирования, проблема в том, что некоторое время reset не поддерживается, но вы можете обернуть входной поток внутри BufferedInputStream, и это нормально.
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BufferedInputStream buffer=new BufferedInputStream(is);
BitmapFactory.decodeStream(buffer,null,options);
buffer.reset();
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
BitmapFactory.decodeStream(buffer,null,options);
Ответ 3
Это может быть редкий случай, но для тех из вас, кто использует Picasso, вы увидите эту ошибку, если попытаетесь загрузить изображение от URL, но URL-адрес не относится к изображению.
Например:
http://www.google.ca
вместо:
https://www.google.ca/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
Ответ 4
У меня была аналогичная проблема при чтении потока из Intent, возвращаемого из приложения галереи. inputstream.reset() выдает исключение IOException, как упоминает выше, и я решил его, просто закрыв поток и снова открыв его. Простой и трюк.
Ответ 5
Как и в случае с Picasso, убедитесь, что ваш URL правильный, просто скопируйте и вставьте ссылку из вашей программы разработки в свой веб-браузер.
Я набрал:
http://lorepixel.com/600/400/city
вместо
http://lorempixel.com/600/400/city