gpt4 book ai didi

android - Assets 中的 BitmapFactory.decodeStream 在 Android 7 上有时会失败

转载 作者:行者123 更新时间:2023-11-30 00:58:16 24 4
gpt4 key购买 nike

我刚从 androidTargetSdk=23 移动到 androidTargetSdk=24。我还使用 JDK 1.8 和 sourceCompatibility="1.7"和 targetCompatibility="1.7"。

以下用于解码 Assets 的现有代码在 Android Studio 的模拟器 Galaxy_S6_API_24 和 Genymotion API 24 模拟器上出现故障(但在运行 API 19 和 21 的真实设备上运行良好)。

myInputStream = getActivity().getAssets().open("images/" + imageName);
BitmapFactory.Options opts = new BitmapFactory.Options();

// Find the size of the image
// (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html)
opts.inJustDecodeBounds = true;
BitmapFactory.decodeStream(myInputStream, null, opts);

// For debugging this issue to keep it simple I've stopped calling calculateInSampleSize()
//opts.inSampleSize = ImageUtils.calculateInSampleSize(opts, width, height);
opts.inSampleSize = 1;
opts.inJustDecodeBounds = false;

bm = BitmapFactory.decodeStream(myInputStream, null, opts);
imageView.setImageBitmap( bm );

在调试这段代码时,myInputStream 不为空,因此找到了 Assets 。方法 decodeStream() 返回 null。

为了进一步调试,我将代码更改为以下内容。此代码有效 - BitmapFactory.decodeStream() 返回有效位图。

myInputStream = getActivity().getAssets().open("images/" + imageName);
BitmapFactory.Options opts = new BitmapFactory.Options();

// Find the size of the image
// (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html)
opts.inJustDecodeBounds = true;
//BitmapFactory.decodeStream(myInputStream, null, opts);

// For debugging this issue to keep it simple I've stopped calling calculateInSampleSize()
//opts.inSampleSize = ImageUtils.calculateInSampleSize(opts, width, height);
opts.inSampleSize = 1;
opts.inJustDecodeBounds = false;

bm = BitmapFactory.decodeStream(myInputStream, null, opts);
imageView.setImageBitmap( bm );

顶部的失败代码与上面运行的代码之间的唯一区别是我注释掉了对 BitmapFactory.decodeStream() 的第一次调用。

为了进一步调试,我简化了代码。这有效:

myInputStream = getActivity().getAssets().open("images/" + imageName);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1;
bm = BitmapFactory.decodeStream(myInputStream, null, opts);
imageView.setImageBitmap( bm );

但这无法显示图像(注意我在下面两次调用了 decodeStream):

myInputStream = getActivity().getAssets().open("images/" + imageName);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1;
bm = BitmapFactory.decodeStream(myInputStream, null, opts);
bm = BitmapFactory.decodeStream(myInputStream, null, opts);
imageView.setImageBitmap( bm );

这也失败了:

myInputStream = getActivity().getAssets().open("images/" + imageName);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1;
bm = BitmapFactory.decodeStream(myInputStream, null, opts);
BitmapFactory.Options opts2 = new BitmapFactory.Options();
opts2.inSampleSize = 1;
bm = BitmapFactory.decodeStream(myInputStream, null, opts2);
imageView.setImageBitmap( bm );

通过调试器,我进入了 BitMapFactory.decodeStream() 的 API 24 源代码。问题是由于对 nativeDecodeAsset() 的调用失败。它总是在第二次使用相同的输入 Assets 调用时失败。我的猜测是我使用的是正确的 native 库,但它有一个错误,或者我使用的库是错误的。

正如我之前提到的,我在运行 API 19 和 21 的真实设备上没有看到这个问题。我只在 Android Studio 的模拟器 Galaxy_S6_API_24 和 Genymotion API 24 模拟器上看到它。

我不清楚如何调试它。我在哪里可以获得与我的构建匹配的 native 库的源代码?你能提出一个解决方案或者我还应该检查什么来解决这个问题吗?我想证明我的代码可以在 Android 7.0 上运行,而无需使用真实设备!

最佳答案

这不是android的问题;在方法 decodestream() 中使用输入流后,输入流变为空;如果您想多次使用输入流,您应该每次都重置它使用它的 .reset() 函数。

关于android - Assets 中的 BitmapFactory.decodeStream 在 Android 7 上有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39824214/

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