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. 实现进程重启后的状态恢复
- 在
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
相关产品推荐
相关产品推荐

