Android BitmapFactory.decodeFile 间歇性返回 null

2023-12-25

我使用的是android 4.0.4,内核3.0.8+

BitmapFactory.decodeFile 有时会返回空位图。

请注意,如果位图工厂无法加载位图,我会立即重试,最多 4 次,这通常有效(!)

有很多人对此有所抱怨。大多数问题都有涉及位图放置位置或刷新输入流/http 连接/其他内容的性质的答案。我已经排除了这些 - 事实上,我已经将我的问题简化为一个如此简单的 Android 应用程序,它可以被称为测试用例。

我的应用程序有一个活动,其中包含一个按钮,按下该按钮时会启动一个线程,该线程循环遍历外部文件目录,尝试将其中的所有内容加载到位图中。我不使用位图,也不保留它,或者任何东西,我只是加载然后忘记:

public class MainActivity extends Activity {

  private static final String TAG = "bmpbash";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  public void onGo(View view) {
    view.setVisibility(View.GONE);
    start();
  }

  /**
   * Start the thread.
   */
  public void start() {
    Runnable r = new Runnable() {
      @Override
      public void run() {
        mainLoop();
      }
    };
    Thread thread = new Thread(r);
    thread.start();
  }

  public void mainLoop() {
    int index = 0;
    File top = getExternalFilesDir(null);
    while (true) {
      File[] files = top.listFiles();
      if (files.length < 1) {
        Log.e(TAG, "no files found");
      } else {
        if (files.length <= index) {
          index = 0;
        }
        File file = files[index];

        //byte[] data = readFile(file);

        try {
          boolean ok = false;
          for (int i = 0; i < 4 && !ok; ++i) {
            //Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
            if (bitmap == null) {
              Log.e(TAG, file.getName() + "[" + i + "] - NULL bitmap");
            } else {
              ok = true;
              Log.w(TAG, file.getName() + "[" + i + "] - OK");
            }
          }
        } catch (Exception e) {
          Log.e(TAG, file.getName() + " - DIED", e);
        } catch (OutOfMemoryError oom) {
          Log.e(TAG, file.getName() + " - OOM");
        }
        ++index;
      }
    }
  }
}    

我会看到这样的输出:

10-22 17:27:57.688: W/bmpbash(1131): translucent.png[0] - OK
10-22 17:27:57.698: W/bmpbash(1131): fearthecow.png[0] - OK
10-22 17:27:57.798: W/bmpbash(1131): gui2.png[0] - OK
10-22 17:27:57.888: W/bmpbash(1131): gui.png[0] - OK
10-22 17:27:58.058: W/bmpbash(1131): boot.png[0] - OK
10-22 17:27:58.218: E/bmpbash(1131): trainer2.png[0] - NULL bitmap
10-22 17:27:58.378: W/bmpbash(1131): trainer2.png[1] - OK

您将在上面的代码中看到有一个被注释掉的替代加载序列,其中我没有使用decodeFile,而是将文件加载到byte[]中,然后使用decodeByteArray。这具有相同的效果(decodeByteArray 失败,然后在完全相同的字节数组上立即成功!),但我确实注意到失败的情况要少得多。

在decodeFile 情况下,可能十分之一的尝试会返回 null。在decodeByteArray 情况下,可能只有百分之一。失败的文件并不总是同一个,但有些文件确实失败seem比其他人更容易失败。

我最好的预感是 png 解码器出现故障,如果运行时间较长,则更有可能发生故障,但在那之后我有点迷失了。如果有人对这个问题有任何了解,或者有其他加载 png 文件的方法,我将非常感激!


进一步的实验表明,这种情况发生在我拥有的每台运行 4.0.4 特定版本的设备(我有很多)上,但即使在 4.1.1 设备上运行过夜也不会发生。考虑到代码的简单性,并且后来的 Android 版本不会复制它,我倾向于将其标记为 Android 中的一个错误,该错误在某些时候已被修复。有了这些信息的帮助,我将假设这是 SKIA 中的一个错误,在此线程中对此进行了第 n 度的争论:

http://code.google.com/p/android/issues/detail?id=6066 http://code.google.com/p/android/issues/detail?id=6066

我的总体观点是,这是一个很少发生的错误,它的存在被大量没有足够仔细处理输入流的人所掩盖。我在任何地方见过的唯一答案this问题是尝试在循环中加载位图(OMG)。然而,如果数百人因为有这些问题而发现这个问题symptoms在采取这种邪恶的黑客行为之前,请百分百确定他们正在使用可行的刷新输入流,那么我想我们都会感激不尽!

Thanks

附:将此称为“答案”而感到内疚可以吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android BitmapFactory.decodeFile 间歇性返回 null 的相关文章

  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • Android JUnit 测试中的运行时异常

    我有一个简单的 HelloWorld Activity 我尝试使用 Android JUnit 测试对其进行测试 应用程序本身按预期运行 但测试失败并显示 java lang RuntimeException 无法解析以下活动 Intent
  • Android 相机旋转

    我有一个 Motorola Defy OS Android 2 1 我制作了一个带有相机预览的应用程序 问题在于 摄像头在运行 Android 2 1 的三星 Galaxy S 上运行良好 但在摩托罗拉上摄像头旋转了 90 度 我尝试这样做
  • 有哪些方法可以避免 String.substring 返回具有无效 unicode 字符的子字符串?

    最近 只有我注意到 有可能substring返回带有无效 unicode 字符的字符串 例如 public class Main public static void main String args String text Salade
  • 以编程方式设置导航视图菜单项样式

    是否可以以编程方式在新导航视图中设置 MenuItem 的样式 我正在动态构建菜单 无法使用静态 XML 文件 我一直无法找到这方面的任何信息 更新 我熟悉设置标题和图标 但不熟悉如何设置 例如设置文本的 Alpha 更新2 在类Navig
  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用

随机推荐

  • 如果输入文件未更改,如何使自定义任务避免重做工作?

    我有一个游戏的多项目设置 有一个非常具体的子项目 称为 资源 它只包含要打包到 jar 中的图像 声音和 texfiles 等文件 我有一个处理图像并打包它们的自定义任务 在 src main 内部 我使用一个文件夹 preprocess
  • 正则表达式从 URL 获取协议

    假设我有一个名为 URL 的变量 它的值是http www google com 我还可以通过 ftp 接收 URL 因此它是ftp ftp google com 我怎样才能拥有它 以便我在之前抓住一切 之后我将有一个 if else 条件
  • 在 QTreeWidget 中调用上下文菜单

    当用户单击 QTreeWidgetItem 中的对象时 我想弹出一个菜单 我想从 QWidget 捕获信号 contextMenuRequested 然后使用 itemAt 从视图中检索索引 但这看起来不太漂亮 有没有更简单的方法可以调用视
  • onMouseMove 获取鼠标位置[重复]

    这个问题在这里已经有答案了 在 Javascript 中 在 onMouseMove 的 Javascript 事件处理程序中 如何获取相对于页面顶部的 x y 坐标中的鼠标位置 如果你可以使用 jQuery 那么this http api
  • 如何创建 Helm Chart 以使用相同的 value.yaml 文件部署多个应用程序

    我正在尝试部署 一个 HTTPD 实例和一个使用相同内容的 couch 数据库实例values yaml file 是否有默认文档可以帮助我了解如何部署两个实例以及使用相同实例的服务values yaml file 有人拥有创建了多个部署和
  • Android 列表视图刷新

    在我的应用程序中 当用户单击 添加 菜单按钮时 会出现一个列表视图 其中填充了从文本文件加载的项目 所以现在用户可以向列表视图添加一项了 将其添加到数组后 新项目将写入文本文件 但不会进入列表视图 因为我想通过将文件读取到数组然后用它填充
  • 计算一周的计算机登录次数

    我可能在错误的地方问这个问题 也许我应该去操作系统论坛 但我仍然想知道这一点 我的工作使用的是 Windows 7 机器 我每天登录 做一些工作 然后注销 当我锁定 Windows L 我的笔记本电脑时 我会短暂休息一下 我必须考虑到本周末
  • 为什么 React Bootstrap Navbar 保持折叠状态?

    我遵循了 React Bootstrap 文档 尤其是这段代码来制作我的导航栏 gt https react bootstrap github io components navbar navbars mobile Friendly htt
  • 如何在android中以编程方式设置微调器的条目?

    我在 string xml 文件中创建了各种字符串数组 并且必须根据 Java 中的某些条件将不同的数组设置为微调器的条目 是否可能 或者数据库是这样做的唯一方法 提前致谢 您需要使用适配器并在 xml 文件中填充 tha 数组 在 xml
  • Web api 开放 oauth(DotNetOpenAuth) mvc 4

    mvc 4 互联网应用程序模板有一个令人惊叹的功能 可以轻松与 facebook twitter 和 google 集成 但web api模板中没有这样的功能 如何轻松集成DotNetOpenAuth使用网络 API 有教程吗 MVC 是一
  • 使用 python 从文本文件读取 - 第一行被遗漏

    我有一个名为 test 的文件 其内容为 a b c d e f g 我使用以下 python 代码逐行读取该文件并将其打印出来 with open test txt as x for line in x print x read 其结果是
  • 带有复选框的 Android 列表视图未按预期运行

    这是关于回收问题 我正在使用自定义适配器来填充列表视图 在自定义行中有一个图像视图 两个文本框和一个复选框 所有元素都已填充 但复选框未正确填充 在 的里面getView 我执行一个条件 如果条件为真 我将复选框设置为启用状态 这工作正常
  • Firebase google 登录身份验证 AppDelegate-使用未解析的标识符“isMFAEnabled”

    我是 iOS 开发新手 我正在尝试将谷歌登录添加到我的应用程序中 但我遇到了一些问题 代码显示一些 使用未解析的标识符 isMFAEnabled 和 类型 AppDelegate 的值没有成员 showTextInputPrompt 请帮助
  • 如何设置 SQL 连接字符串的查询超时

    我想从连接字符串设置查询超时 不是连接超时 有可能吗 不 这是每个命令 而不是每个连接 2013 年 5 月编辑 按照评论中的要求 SQLCommand CommandTimeout http msdn microsoft com en u
  • Apache Oltu Spring Security OAuth2 和 Google 集成

    参考资料纯粹取自以下网站 http syntx io integrating your java spring mvc webapp with facebook doing the oauth dance http syntx io int
  • 在 d3.geo MultiPoint 中,如何为不同的点提供不同的形状?

    我有一些 geoJson 数据 正在使用 d3 geo 绘制图表 当我写类似的东西时 d3 select svg attr d function d return path type MultiPoint coordinates get a
  • 密码哈希和加盐 - 这是一个好方法吗?

    我做了一些研究或谷歌搜索处理密码散列和加盐的不同方法 并发现了这个有趣的链接 http phix me salt https web archive org web 20090228183138 http phix me salt 现在 本
  • 在 Windows 机器上安装 ruby​​ gems 时出现“安装捆绑程序”错误

    我正在尝试安装 middleman 一个静态站点生成器 它使用 ruby gems 它能够构建所有本机扩展 但不能构建 wdm 我运行时收到以下错误消息install bundler我的命令提示符中的命令 Gem Ext BuildErro
  • 尽管宽度相同,集合视图网格最后一行的显示不同 - swift iOS

    我有一个固定的集合视图单元格 UICollectionView 网格 但底行中的单元格始终在屏幕上显示的宽度稍小 collectionViewLayout UICollectionViewLayout sizeForItemAt 中使用的框
  • Android BitmapFactory.decodeFile 间歇性返回 null

    我使用的是android 4 0 4 内核3 0 8 BitmapFactory decodeFile 有时会返回空位图 请注意 如果位图工厂无法加载位图 我会立即重试 最多 4 次 这通常有效 有很多人对此有所抱怨 大多数问题都有涉及位图