java - 创建位图 NullPointerException

标签 java android bitmap

我的应用程序崩溃了,我似乎无法解决。

我像这样从资源中获取位图。

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

现在,当涉及到从该位图创建位图时,这似乎在极少数设备上存在问题。例如……

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

当它在 Bitmap 类的第 468 行创建 Bitmap 时,我得到一个 NullPointerException,我已经查看了它及其当它从源位图中设置新位图的密度比例时。

// 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());

现在我似乎无法重现问题,但事实上当在原始位图上调用 getWidth() 时我没有得到异常告诉我源不为空。

这是整个堆栈跟踪。

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

我的想法

不包括不同屏幕密度的不同位图可能与我有关吗?提供的所有位图均适用于 mdpi 屏幕。

我注意到还有一个 BackStackRecord。当用户按回键时这会崩溃吗?

提前致谢

最佳答案

您在 Bitmap.java:468 中指向的来源来自 Android 1.5,可能不是您的问题。

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

比 2.2 更新的任何版本中的第 468 行要么是 javadoc block 的一部分,要么是不相关的函数,所以我猜你正在查看 1.6-2.2 版本,而不是你试图从中进行故障排除的版本。

我在该行中看到的唯一可能真正以 null 结尾的是 config。在您的代码中,您使用 getConfig() 从当前位图对象中获取它。 docs因为它显示:

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.

因此,它可能没有找到“公共(public)”格式,并返回 null,它传递给 createBitmap(),并破坏了您的代码。

您可以使用 static config始终如此,例如 Bitmap.Config.ARGB_8888,或者在前一行执行 getConfig() 并对其进行空检查。如果为空,则转到刚才提到的后备配置。

关于java - 创建位图 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14437013/

相关文章:

java - 如何将数组作为节点列表返回

java - sqlite db android 没有正确添加用户

java - Scala : compilation error due to huge number of methods in chain

Android:通过 adb shell am 启动应用程序信息对话框

android - 如何使用 LiveData 观察共享偏好的变化?

android - 有效地将位图数组转换为视频

vb.net - 有没有更快的方法将位图像素转换为灰度?

java - 创建自己的周期类时遇到困难

C++:在另一个 Graphics* 对象内绘制 Graphics* 对象的最佳方式

java - 打开通知设置页面 android oreo