Android 10. MediaStore DATE_TAKEN始终返回null

问题描述 投票:0回答:1

我在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()
}
android kotlin mediastore android-10.0
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.