3

我发布了一个 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);

其中InputMethodServicecontext子类是FileInputStreamAssetInputStream(我都试过了)。资源文件是编译后的NinePatchDrawable。我已经确认流不为空。stream

重复一遍:这个错误只发生在运行各种版本的 Android 操作系统的某些 HTC 手机(包括 Evo)上。

有没有人经历过这个和/或知道如何解决它?

提前致谢,

巴里

PS 奇怪的是,崩溃线 465 不在任何版本的BitmapFactory.java中的崩溃方法BitmapFactory.decodeResourceStream()中,因此 HTC 必须使用修改后的代码。

4

3 回答 3

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

这仅适用于文件。

于 2012-02-08T14:45:52.973 回答
1

你可以只使用Drawable.createFromStream ()而不是Drawable.createFromResourceStream()

于 2012-01-12T08:28:42.183 回答
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 设备上验证这一点吗?

于 2013-10-14T15:08:34.923 回答