Search code examples
androidbitmapdrawbitmap

NullPointerException Cant find bitmap from drawable on oppo device


im trying to get imageview from drawable and resize it my current code is working on all devices except on oppo devices it crash inside crop() method

the crash im getting is on the first line in crop() method you can find below

Caused by: java.lang.NullPointerException: 

my current code is:

public Bitmap getTileBitmap(int id, int size) {
    String string = tileUrls.get(id);
    if (string.contains(Themes.URI_DRAWABLE)) {
        String drawableResourceName = string.substring(Themes.URI_DRAWABLE.length());
        int drawableResourceId = Shared.context.getResources().getIdentifier(drawableResourceName, "drawable", Shared.context.getPackageName());
        Bitmap bitmap = Utils.scaleDown(drawableResourceId, size, size);
        return Utils.crop(bitmap, size, size);

    }
    return null;
}


public static Bitmap crop(Bitmap source, int newHeight, int newWidth) {
    int sourceWidth = source.getWidth();
    int sourceHeight = source.getHeight();
    float xScale = (float) newWidth / sourceWidth;
    float yScale = (float) newHeight / sourceHeight;
    float scale = Math.max(xScale, yScale);
    float scaledWidth = scale * sourceWidth;
    float scaledHeight = scale * sourceHeight;
    float left = (newWidth - scaledWidth) / 2;
    float top = (newHeight - scaledHeight) / 2;
    RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
    Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());
    Canvas canvas = new Canvas(dest);
    canvas.drawBitmap(source, null, targetRect, null);

    return dest;
}

EDIT: added scale method which may cause the issue

public static Bitmap scaleDown(int resource, int reqWidth, int reqHeight) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(Shared.context.getResources(), resource);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(Shared.context.getResources(), resource, options);
}

and so far im not sure what is causing the crash only on oppo devices


Solution

  • Try this:

    options.inJustDecodeBounds = true;
    options.inScaled = false;
    options.inDensity = 0;
    options.inMutable = true; //API 11. Pass to canvas? Might crash without this.
    //Load the image here... BitmapFactory.decodeResource()...
    
    ... //Some calculations.
    
    options.inJustDecodeBounds = false;
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;