我已经发布了一个IME(软键盘)应用程序,我只收到来自 HTC手机的崩溃报告。这是堆栈跟踪:
java.lang.NullPointerException
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:465)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:666)
at com.comet.android.keyboard.util.Util.getBitmapDrawable(MyFile.java:416)
...
这是我对Drawable.createFromResourceStream()
的调用drawable = Drawable.createFromResourceStream(context.getResources(), null, stream, null);
其中context
InputMethodService 和stream
的子类是 FileInputStream 或 AssetInputStream (我是试过两个)。资源文件是已编译的 NinePatchDrawable 。我已经确认流不是空的。
要重复:此错误仅发生在运行各种版本的Android操作系统的某些HTC手机(包括Evo)上。
有没有人经历过这个和/或知道如何修复它?
提前致谢,
百里
P.S。奇怪的是,崩溃线465不在任何版本的 BitmapFactory.java 中的崩溃方法 BitmapFactory.decodeResourceStream()中,因此HTC必须使用修改后的代码。
答案 0 :(得分:4)
找到此问题的解决方案,您可以将调用替换为Drawable.createFromResourceStream
:
// set options to resize the image
Options opts = new BitmapFactory.Options();
opts.inDensity = 160;
Drawable drawable = null;
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
if (bm != null) {
drawable = new BitmapDrawable(context.getResources(), bm);
}
这仅适用于文件。
答案 1 :(得分:1)
您可以使用Drawable.createFromStream ()
代替Drawable.createFromResourceStream()
答案 2 :(得分:0)
您是否尝试过向Drawable.createFromResourceStream
提供一整套有效的参数?
我查看了Android代码,您安全地传递了虚拟TypedValue
和虚拟Options
对象,并仍然保持默认行为。
所以:
Options opts = new BitmapFactory.Options();
TypedValue dummy = new TypedValue();
Drawable d = Drawable.createFromResourceStream( mContext.getResources(), dummy, in, assetPath, opts);
任何人都可以在HTC设备上验证这一点吗?