Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create Bitmap NullPointerException

I have a crash on an application that I can't seem to work out.

I get a bitmap from resource like so.

Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.map_distance_tag);

Now this seems to have problems on a very small minority of devices when it comes to creating a bitmap from this bitmap. For example...

Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());

I get a NullPointerException when it creates the Bitmap on line 468 of the Bitmap class, thich I have had a look into and its when its setting the density scale of the new bitmap from its source bitmap.

// The new bitmap was created from a known bitmap source so assume that
467        // they use the same density scale
468        bitmap.setDensityScale(source.getDensityScale());

Now I can't seem to recreate the problem but the fact I don't get an exception when getWidth() is called on the original Bitmap tells me that the source isn't null.

Here is the entire stack trace.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.recording.TrackingActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
at com.my.app.maps.MapFragment.createTabOverlay(MapFragment.java:663)
at com.my.app.maps.MapFragment.addMarkersForToolType(MapFragment.java:474)
at com.my.app.maps.MapFragment.onActivityCreated(MapFragment.java:405)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
at com.my.app.recording.TrackingActivity.onStart(TrackingActivity.java:272)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
at android.app.Activity.performStart(Activity.java:3781)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
... 11 more

My Idea

Could it be something to do with me not including different bitmaps for different screen densities? All the Bitmaps supplied are for mdpi screens.

I notice there is also a BackStackRecord. Could this be crashing when the user presses back?

Thanks in advance

like image 608
StuStirling Avatar asked Apr 25 '26 15:04

StuStirling


2 Answers

The source you point at in Bitmap.java:468 is from Android 1.5, and probably isn't your issue.

v1.5 Bitmap.java:468

bitmap.setDensityScale(source.getDensityScale());

v1.6-v2.2 Bitmap.java:468

Bitmap bm = nativeCreate(null, 0, width, width, height, config.nativeInt, true);

Line 468 in anything newer than 2.2 is either part of a javadoc block or an unrelated function, so I'm guessing you're looking at the 1.6-2.2 version, not the one you're trying to troubleshoot from.

The only thing on that line I see that could really end up null is config. In your code, you use getConfig() to grab that from the current bitmap object. The docs for it show:

public final Bitmap.Config getConfig ()

Added in API level 1

If the bitmap's internal config is in one of the public formats, return that config, otherwise return null.

So, it's probably not finding a "public" format, and returning null, which passes to createBitmap(), and blows up your code.

You can either use a static config all the time, like Bitmap.Config.ARGB_8888, or do the getConfig() on a previous line and null-check it. If null, then go to a fallback config like just mentioned.

like image 175
Geobits Avatar answered Apr 28 '26 05:04

Geobits


yourSelectedImageBitmap = BitmapFactory.decodeFile(filePath, options);

    if (yourSelectedImageBitmap != null) {
        // ----------resize for set in imageView------------
        int width = yourSelectedImageBitmap.getWidth();
        int height = yourSelectedImageBitmap.getHeight();
        int newWidth = 140;
        int newHeight = 140;

        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        if (exifOrientation.equals("6")) {
            matrix.postRotate(90);
        }

        Bitmap resizedBitmap = Bitmap.createBitmap(yourSelectedImageBitmap,
                0, 0, width, height, matrix, true);
        image.setImageBitmap(resizedBitmap);

        // Toast.makeText(getApplicationContext(),
        // "in the select image loop", 2000).show();

        // ----------resize for upload------------
        int width1 = yourSelectedImageBitmap.getWidth();
        int height1 = yourSelectedImageBitmap.getHeight();

You can give a try by this way.After getting the image from the file source or camera.

and then by doing this.

Matrix matrix1 = new Matrix();
        // resize the bit map
        matrix.postScale(width1, height1);
        if (exifOrientation.equals("6")) {
            matrix1.postRotate(90);
        }
        Bitmap resizedBitmap1 = Bitmap.createBitmap(
                yourSelectedImageBitmap, 0, 0, width1, height1, matrix1,
                true);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        resizedBitmap1.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] image_bytes = baos.toByteArray();

        try {
            baos.flush();
            baos.close();

        } catch (IOException e) {
            e.printStackTrace();
            Log.e("~~~~~~~~IOException~~~~~~~~~eeeeee~~~~",
                    "~~~~~~IOException~~~~~~~~~eeeee~~~~" + e.getMessage());
        }
        image_string = Base64.encodeToString(image_bytes, 0);

Hope this will help you

like image 40
vyas Avatar answered Apr 28 '26 04:04

vyas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!