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
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With