gpt4 book ai didi

android - Assets 中的 BitmapFactory.decodeStream 在 Android 7 上返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:04:22 26 4
gpt4 key购买 nike

如何在 Android 7 中解码 Asset 目录中的位图?

我的应用程序在 Marshmallow 之前的 Android 版本上运行良好。对于 Android 7,它无法从 Asset 目录加载图像。

我的代码:

private Bitmap getImage(String imagename) {
// Log.dd(logger, "AsyncImageLoader: " + ORDNER_IMAGES + imagename);

AssetManager asset = context.getAssets();
InputStream is = null;
try {
is = asset.open(ORDNER_IMAGES + imagename);
} catch (IOException e) {
// Log.de(logger, "image konnte nicht gelesen werden: " + ORDNER_IMAGES + imagename);
return null;
}


// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, PW, PH);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

// Lesen des Bitmaps in der optimierten Groesse
return BitmapFactory.decodeStream(is, null, options);

}

结果(仅 Android 7)BitmapFactory.decodeStream 为空。它适用于较旧的 Android API。

在 Debug模式下,我看到以下消息:

09-04 10:10:50.384 6274-6610/myapp D/skia: --- SkAndroidCodec::NewFromStream returned null

谁能告诉我原因以及如何更正编码?

编辑:同时我发现,使用 inJustDecodeBounds=true 删除第一个 BitmapFactory.decodeStream 会导致随后使用 inJustDecodeBounds=false 成功执行 BitmapFactory.decodeStream。不知道原因,也不知道如何替代位图​​大小的测量。

最佳答案

我认为我们在同一条船上。我的团队和你一样在这个问题上停留了一段时间。

看来是 BitmapFactory.cpp 的问题 ( https://android.googlesource.com/platform/frameworks/base.git/+/master/core/jni/android/graphics/BitmapFactory.cpp ) 在 Android 7.0 中添加了一些代码,导致了这个问题。

// Create the codec.
NinePatchPeeker peeker;
std::unique_ptr<SkAndroidCodec> codec(SkAndroidCodec::NewFromStream(streamDeleter.release(), &peeker));
if (!codec.get()) {
return nullObjectReturn("SkAndroidCodec::NewFromStream returned null");
}

我发现 BitmapFactory.decodeStream 方法在我们设置 inJustDecodeBounds=false 之后没有创建位图,但是当我尝试在没有绑定(bind)解码的情况下创建位图时。其作品!问题出在 BitmapOptions 上,当我们再次调用 BitmapFactory.decodeStream 时 InputStream 没有更新。

所以我在再次解码之前重置了 InputStream

private Bitmap getBitmapFromAssets(Context context, String fileName, int width, int height) {
AssetManager asset = context.getAssets();
InputStream is;
try {
is = asset.open(fileName);
} catch (IOException e) {
return null;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);
try {
is.reset();
} catch (IOException e) {
return null;
}
options.inSampleSize = calculateInSampleSize(options, width, height);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(is, null, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}

看起来我们每次重用之前都必须重置 InputStream。

关于android - Assets 中的 BitmapFactory.decodeStream 在 Android 7 上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39316069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com