小米Redmi Note7调用MediaStore.getBitmap报NullPointerException问题求助
解决小米Redmi Note7上拍照后Uri为空的NullPointerException问题
你的程序在多数设备运行正常,但在Redmi Note7上触发java.lang.NullPointerException: uri,核心原因是拍照过程中Activity被系统回收,导致保存Uri的成员变量uripic丢失,加上缺少必要的空值校验,最终在onActivityResult中触发异常。以下是针对性的解决方案:
1. 持久化保存Uri,避免Activity回收丢失
Android系统在内存不足时会销毁后台Activity,拍照操作耗时较长,Redmi Note7可能更容易触发这个机制。需要在Activity销毁前保存Uri,重建时恢复:
// 保存Uri到Bundle override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) uripic?.let { outState.putString("photo_uri", it.toString()) } } // 在onCreate中恢复Uri override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_activity_layout) savedInstanceState?.getString("photo_uri")?.let { uripic = Uri.parse(it) } }
2. 确保图片存储目录有效
虽然多数设备getExternalFilesDir不会返回null,但Redmi Note7可能存在特殊情况(如存储权限异常),需要增加非空校验,避免创建文件失败导致Uri生成错误:
private fun createImageFile(): File { val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) val filename = "${timeStamp}_" // 强制校验存储目录,避免空指针 val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) ?: throw IOException("无法获取图片存储目录,请检查存储权限") return File.createTempFile( filename, ".jpg", storageDir ).apply { currentPhotoPath = absolutePath } }
3. 增加onActivityResult的空值防御
在处理图片前先检查uripic是否为空,避免直接调用导致异常:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 2) { try { uripic?.let { uri -> // 仅当Uri不为空时处理图片 val pic = MediaStore.Images.Media.getBitmap(this.contentResolver, uri) // 执行加水印逻辑 } ?: run { // 处理Uri为空的情况,比如提示用户重新拍照 errorlog(this, NullPointerException("拍照后图片Uri为空"), "onActivityResult", localClassName) } } catch (e: Exception) { val name = object{}.javaClass.enclosingMethod.name errorlog(this, e, name, localClassName) } } }
额外注意点
- 确认FileProvider的配置在AndroidManifest中正确,避免Uri生成失败:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.poneksimsfa.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> - 确保
file_paths.xml配置正确,指向你存储图片的目录。
内容的提问来源于stack exchange,提问作者Nicholas Denny
相关产品推荐
相关产品推荐

