Запись данных в собственную кучу на диск в Android - PullRequest
0 голосов
/ 23 марта 2020

Я выполняю кодирование JPEG данных RGB в собственном коде, а окончательные данные в кодировке JPEG доступны в собственном байтовом массиве. Каковы эффективные способы записи этих данных на диск? Больше нет обработки для этого вывода.

Некоторые варианты, о которых я мог подумать:

  • Скопировать данные между Java Собственная граница и записать данные на диск используя стандартный Android подход.
  • Запись данных на диск в самом собственном коде. Но с переходом Android Q к доступу к хранилищу в определенной области я записывал данные через MediaStore. Можем ли мы записать в MediaStore из собственного кода?
  • Выделить ByteBuffer в коде Java, передать его в собственный код для записи, а затем, после завершения кодирования, передать sh данные в ByteBuffer на диск , Это кажется справедливым, но я бы предпочел сделать управление памятью в собственном слое, чем в зависимости от G C в java слое.

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

1 Ответ

1 голос
/ 23 марта 2020

Если файлы предназначены только для потребления вашим приложением, вы можете просто записать их в кеш приложений (getExternalCacheDir) или каталог данных (getExternalFilesDir).

Если вы Если вы хотите сделать их доступными для других файлов, вы можете использовать среду MediaStore, как вы намекнули. Вы можете адаптировать этот пример в официальной документации к следующему:

val resolver = applicationContext.contentResolver

val imagesCollection = MediaStore.Images.Media
        .getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)

val imageDetails = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "fancy_image.jpg")
    put(MediaStore.Images.Media.IS_PENDING, 1)
}

val imageContentUri = resolver.insert(imagesCollection, imageDetails)

resolver.openFileDescriptor(imageContentUri, "w", null).use { pfd ->
    int fd = pfd.getFd
    // this would be your native implementation. it should `write()` to the fd or 
    // call `fdopen` and then `fwrite`. The `use` block will automatically call 
    // `close` for you.
    native_writeFile(fd)
}

// Now that we're finished, release the "pending" status, and allow other apps
// to see the image
imageDetails.clear()
imageDetails.put(MediaStore.Images.Media.IS_PENDING, 0)
resolver.update(imageContentUri, imageDetails, null, null)
...