android - Android10。MediaStoreDATE_TAKEN始终返回null

标签 android kotlin mediastore android-10.0

我在Android 10中有问题。

在默认相机应用程序上拍照时,DATE_TAKEN返回正常值。

但是当我在代码中插入图片时,它总是返回null。

如何获得正常的DATE_TAKEN值?

//读取时

val cursor = context!!.contentResolver.query(data, null, null, null, null, null)
val date_taken = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN))
Toast.makeText(context, date_taken, Toast.LENGTH_SHORT).show()

//保存代码
val now = System.currentTimeMillis()

val value = ContentValues().apply {
  put(MediaStore.Images.Media.RELATIVE_PATH, DCIM/customPath)
  put(MediaStore.Images.Media.DISPLAY_NAME, "image.jpeg")
  put(MediaStore.Images.Media.MIME_TYPE, "image/*")
  put(MediaStore.Images.Media.DATE_ADDED, now / 1000)
  put(MediaStore.Images.Media.DATE_TAKEN, now)
  put(MediaStore.Images.Media.IS_PENDING, 1)
}

val item: Uri = contentResolver.insert(collection, value)!!

try {
  val pdf = contentResolver.openFileDescriptor(item, "w", null)

  if (pdf != null) {
    val inputStream = getImageInputStream(agreePaper2)
    val strToByte = getBytes(inputStream)
    FileOutputStream(pdf.fileDescriptor).use { it.write(strToByte) }
    inputStream.close()
    pdf.close()
    contentResolver.update(item, value, null, null)
  }
} catch (e: FileNotFoundException) {
  e.printStackTrace()
} catch (e: IOException) {
  e.printStackTrace()
}

value.clear()
value.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(item, value, null, null)

// getImageInputStream
private fun getImageInputStream(bitmap: Bitmap): InputStream {
  val bytes = ByteArrayOutputStream()
  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
  val bitmapData = bytes.toByteArray()

  return ByteArrayInputStream(bitmapData)
}

// getBytes
private fun getBytes(inputStream: InputStream): ByteArray {
  val byteBuffer = ByteArrayOutputStream()
  val bufferSize = 1024
  val buffer = ByteArray(bufferSize)

  var len = inputStream.read(buffer)

  while (len != -1) {
    byteBuffer.write(buffer, 0, len);
    len = inputStream.read(buffer)
  }

  return byteBuffer.toByteArray()
}

最佳答案

我能想到的是,您必须首先通过cursor.movetoFirst()至少移至光标中的第一个条目

另外,您也不必设置DATE_ADDED,因为它会被MediaProvider覆盖。您无需在try-catch-block中第二次更新。

关于android - Android10。MediaStoreDATE_TAKEN始终返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60916878/

相关文章:

Android、setSelected() 和 state_selected

java - 如何使用ToneGenerator发出双声提示音

kotlin - 协程范围的构造函数中的协程上下文的Kotlin组成

android - 纹理的最大尺寸是多少(Andengine)

android - 等待 Activity 显示

Android - fragment 是 "transparent",我可以点击它

android - 使用 MediaStore android 重命名图像

android - MediaStore.Images.Media.insertImage - java.io.FileNotFoundException - Android

安卓媒体商店 : How to efficiently retrieve all songs of a certain genre?

android - Google Play 游戏服务多人 iOS 和 Android