Drawable.createFromResourceStream()中的异常 - 仅限HTC?

时间:2011-10-12 21:56:03

标签: android nine-patch android-assets htc-android

我已经发布了一个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必须使用修改后的代码。

3 个答案:

答案 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设备上验证这一点吗?