我已经发布了一个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。我已经确认流不为空。
重复:此错误仅发生在某些HTC手机(包括Evo)运行不同版本的Android操作系统。
有人经历过这个和/或知道如何修复它吗?
提前感谢,
巴里注:奇怪的是,崩溃行465不在崩溃方法BitmapFactory.decodeResourceStream()在任何版本的BitmapFactory.java中,所以HTC必须使用修改过的代码
找到这个问题的解决方案,您可以将对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);
}
这只适用于文件。
可以直接用Drawable.createFromStream ()
代替Drawable.createFromResourceStream()
您是否尝试过为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设备上验证这一点?