You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java APK从相机Intent返回后白屏崩溃问题求助

问题:调用系统相机后部分设备应用重启、数据丢失并崩溃

我开发的Java APK使用以下代码启动相机:

cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
cameraIntent.putExtra("android.intent.extra.quickCapture", true);
//File photoFile = createImageFile();
//Uri photoURI = FileProvider.getUriForFile(getApplicationContext(),
                                 "com.lo.test.provider", photoFile);
//cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(cameraIntent, REQUEST_CAPTURE_IMAGE);

多数设备可正常在onActivityResult中处理拍摄的照片,但部分设备返回后出现白屏,日志显示应用进程被终止后重启:

2023-10-22 01:45:02.056 13137-13137 System.out              com.lo.test                 I  Fin de openCameraIntent 
2023-10-22 01:45:02.056 13137-13137 Second Activity         com.lo.test                 V  Fin de openCameraIntent 
2023-10-22 01:45:12.449 13137-13150 o.test         com.lo.test                 W  Reducing the number of considered missed Gc histogram windows from 111 to 100
---------------------------- PROCESS ENDED (13137) for package com.lo.test ----------------------------
---------------------------- PROCESS STARTED (17417) for package com.lo.test ----------------------------
2023-10-22 01:45:21.991 17417-17417 ActivityThread          com.lo.test                 I  Relaunch all activities: onCoreSettingsChange
2023-10-22 01:45:22.040 17417-17417 ziparchive              com.lo.test                 W  Unable to open '/data/app/~~w5RdZZDsNzvS9Unhg0IXiw==/com.lo.test-hPTUSB_ZDsOQzoOcVmvj9w==/base.dm': No such file or directory
2023-10-22 01:45:22.040 17417-17417 ziparchive              com.lo.test                 W  Unable to open '/data/app/~~w5RdZZDsNzvS9Unhg0IXiw==/com.lo.test-hPTUSB_ZDsOQzoOcVmvj9w==/base.dm': No such file or directory

重启后数据库查询返回空(实际有数据),随后应用崩溃。

分析

从日志可以看出核心问题:应用进程被系统终止后重启。主要原因有两点:

  1. 系统内存不足:相机应用占用大量内存,导致后台的应用被系统杀死回收。
  2. 进程重启后状态未恢复:进程重启后,内存中的所有对象(包括数据库连接、页面状态)都被清空,而应用未正确处理这种情况,导致查询无数据并崩溃。
解决方案

1. 实现进程重启后的状态恢复

  • 在Activity的onSaveInstanceState方法中保存关键状态数据(如当前页面业务上下文、未完成操作标识),在onCreate或onRestoreInstanceState中读取并恢复这些状态。
  • 禁止依赖内存缓存存储重要数据,所有需要持久化的信息必须写入数据库、SharedPreferences或文件中。

2. 优化相机调用逻辑

  • 启用你注释掉的代码,使用MediaStore.ACTION_IMAGE_CAPTURE配合FileProvider指定输出路径,这种方式比直接调用系统相机应用更轻量,能降低内存占用:
    File photoFile = createImageFile();
    Uri photoURI = FileProvider.getUriForFile(getApplicationContext(),
                                    "com.lo.test.provider", photoFile);
    cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
    startActivityForResult(cameraIntent, REQUEST_CAPTURE_IMAGE);
    
  • 确保createImageFile()创建的文件位于应用私有目录(如getExternalFilesDir(Environment.DIRECTORY_PICTURES)),避免权限问题,同时在拍摄完成后及时清理临时文件。

3. 修复数据库连接问题

  • 进程重启后,旧的SQLiteOpenHelper或数据库连接实例已失效,必须重新初始化数据库助手类,不要复用之前的实例。
  • 封装数据库访问逻辑,确保每次操作数据库时都检查连接有效性,避免因无效连接导致的查询失败或崩溃。

4. 适配系统配置变更

  • 在AndroidManifest.xml中对涉及相机调用的Activity添加配置变更处理,避免系统因屏幕旋转等操作重启Activity:
    <activity
        android:name=".YourCameraActivity"
        android:configChanges="orientation|screenSize|keyboardHidden" />
    
  • 如果需要适配配置变更,在onConfigurationChanged方法中处理UI和数据的适配逻辑,避免状态丢失。

内容的提问来源于stack exchange,提问作者Jorge Infante Osorio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:15:30