Получить добавленную / измененную / снятую дату видео из MediaStore

#android #date #video #mediastore #last-modified

#Android #Дата #Видео #mediastore #последнее изменение

Вопрос:

Где я могу получить снятую дату видео из MediaStore? Я получил следующие поля из MediaStore.

 MediaStore.Video.Media.DATE_MODIFIED
MediaStore.Video.Media.DATE_TAKEN
MediaStore.Video.Media.DATE_ADDED
  

Эти поля вернули приемлемые значения по умолчанию —

 dateModified: 1477043336
dateTaken: 1477043336000
dateAdded: 1477043352
  

Форматированные даты —

 dateModified: 01/01/1970
dateTaken: 01/01/1970
dateAdded: 01/01/1970
  

Я дважды проверил галерею стоков> случайный видеофайл, и я вижу правильные даты. Я просмотрел столбцы видео в MediaStore и не увидел никаких других столбцов с правильными датами.

     SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
    String formattedDate = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));

    String dateModified = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
    String dateTaken = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN) * 1000L));
    String dateAdded = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED) * 1000L));

    Log.d(TAG, "dateModified: " dateModified);
    Log.d(TAG, "dateTaken: " dateTaken);
    Log.d(TAG, "dateAdded: " dateAdded);

    Log.d(TAG, "dateModified: " row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
    Log.d(TAG, "dateTaken: " row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN)));
    Log.d(TAG, "dateAdded: " row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED)));
  

Комментарии:

1. Запрашиваете ли вы эти столбцы в своем запросе? Если вы посмотрите на простые числовые значения (вместо того, чтобы пытаться форматировать их как даты), какие значения вы увидите?

2. Да, я добавил к первоначальному сообщению необработанные данные из MediaStore.

Ответ №1:

 //Just multiply it by 1000 to get correct date
     
    fun convertLongToDate(time: Long): String =
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                DateTimeFormatter.ofPattern("dd MMMM yyyy").format(
                        Instant.ofEpochMilli(time*1000)
                                .atZone(ZoneId.systemDefault())
                                .toLocalDate())
            } else {
                SimpleDateFormat("dd MMMM yyyy").format(
                        Date(time * 1000)
                )
            }
  

Ответ №2:

Глядя на аннотации в интерфейсе, DATE_ADDED и DATE_MODIFIED аннотируются как СЕКУНДЫ с момента эпохи, а не миллисекунды. DATE_TAKEN однако аннотируется как миллисекунды с момента создания.

Это различие в аннотации объясняет различия в нулях, отмеченные в ответе CommonsWare. Это также определяет использование:

Поскольку форматеры даты обычно ожидают временные метки в миллисекундах, вам следует сначала умножить вторые значения на 1000.

Ответ №3:

Вот простая функция для получения фактического результата в формате даты.

 public String getDate(long val){
   val*=1000L;
   return new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(val));
}
  

Ответ №4:

Эти поля вернули приемлемые значения по умолчанию

Я не знаю, почему у вашего второго видео три дополнительных нуля в конце. Но, используя сайт-конвертер даты в Unix:

  • Измененная дата = 1477043336 = Пт, 21 окт 2016 09:48: 56 GMT
  • Добавленная дата = 1477043352 = Пт, 21 окт 2016 09:49:12 GMT

И ваш dateTaken , без нулей, такой же, как dateModified . Итак, предполагая, что вы можете выяснить, откуда взялись ваши нули (например, случайным образом решив умножить значение на 1000L), у вас есть действительные временные метки.

Комментарии:

1. Спасибо, я пропустил эту часть.

Ответ №5:

Синтаксис для преобразования эпохи в обычную дату в Android следующий

 long date=System.currentTimeMillis(); //current android time in epoch 
  

Преобразует эпоху в формат даты «дд / ММ / гггг ЧЧ: мм: сс»
Означает 1477043336 = 21/10/2016 09:48:56

 String NormalDate = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(date));