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

小米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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:55:13