I have an error that only appears in froyo devices
nullpointerexception in Bitmap.createScaledBitmap()
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:344)
at com.varxstudio.beautifulwallpapersLite.Imagen.a(Unknown Source)
at com.varxstudio.beautifulwallpapersLite.g.a(Unknown Source)
at com.varxstudio.beautifulwallpapersLite.g.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
and here is the code any solution?? why only in froyo???
previously only used BitmapFactory.decodeStream(inputStream) to load images but I found a flusedInputStream method to do this but I still get the same error
private class DownloadDialog extends AsyncTask<Void, Void, Void> {
ProgressDialog myDialog = null;
int result = 0;
@Override
protected void onPreExecute() {
myDialog = ProgressDialog.show(Imagen.this, "", advert);
myDialog.setCancelable(true);
return;
}
@Override
protected Void doInBackground(Void... params) {
result = setWallpaper(path);
return null;
}
@Override
protected void onPostExecute(Void result) {
myDialog.dismiss();
switch (result){
----
}
return;
}
}
public int setWallpaper(String path) {
int width, height;
Bitmap dbm, bm;
bm = null;
dbm = null;
InputStream is = null;
WallpaperManager wpm = WallpaperManager.getInstance(this);
dis = getWindowManager().getDefaultDisplay();
if((wpm != null) && (dis != null)){
height = dis.getHeight();
width = (int) (height * 1.33);
try {
URLConnection conn = new URL(path).openConnection();
conn.connect();
is = conn.getInputStream();
if (is != null) {
bm = BitmapFactory.decodeStream(new FlushedInputStream(is));
dbm = Bitmap.createScaledBitmap(bm, width, height, false);
wpm.setBitmap(dbm);
}else {
return 2;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
if(bm != null){
bm.recycle();
}
if(dbm != null){
dbm.recycle();
}
}else {
return 1;
}
return 0;
}
static class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int b = read();
if (b < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
You’ve got the NullPointerException because
BitmapFactory.decodeStream(new FlushedInputStream(is));returns null, Reasons whyBitmapFactory.decodeStream(stream)returns null is because of the bad image..Bad Image in the sense make sure that your are returning the bitmap format supported by Android,(Example
Android doesn't support tiff). And the second reason is because of the image Resolution, if the image resolution is too high that decoding fails..so make sure that you’ve small image.This is the question I have posted in the SO regarding the same..Bitmap failed to create using BitmapFactory.decodeArray
I have faced the same problem earlier but I have over come it by using the tutorial provided by Android developers site Displaying Bitmaps Efficiently