1

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;
    }
}

1 Answers1

4

You've got the NullPointerException because BitmapFactory.decodeStream(new FlushedInputStream(is)); returns null, Reasons why BitmapFactory.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

Community
  • 1
  • 1
Pragnani
  • 20,075
  • 6
  • 49
  • 74