Android 10. MediaStore DATE_TAKEN всегда возвращает ноль - PullRequest
1 голос
/ 29 марта 2020

У меня проблема с Android 10.

DATE_TAKEN возвращает нормальное значение, когда я делаю снимок в приложении камеры по умолчанию.

, но всегда возвращает ноль, когда я вставляю изображение в свой код .

Что я должен сделать, чтобы получить нормальное значение 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()
}

1 Ответ

0 голосов
/ 11 апреля 2020

Я могу подумать о том, что сначала нужно перейти как минимум к первой записи в курсоре на cursor.movetoFirst()

Также вам не нужно устанавливать DATE_ADDED, так как он будет перезаписан MediaProvider . Вам не нужно обновлять второй раз в блоке try-catch.

...