Реализация кроссплатформенной функциональности камеры в KMM: сохранение изображений на iOSIOS

Программируем под IOS
Ответить
Anonymous
 Реализация кроссплатформенной функциональности камеры в KMM: сохранение изображений на iOS

Сообщение Anonymous »

Я работаю над многоплатформенным мобильным приложением Kotlin (KMM) и пытаюсь реализовать унифицированные функции камеры, которые позволяют пользователям делать фотографии и сохранять их в файловой системе устройства как на Android, так и на iOS. Хотя я успешно завершил реализацию Android, я столкнулся с трудностями при поиске и реализации эквивалентного подхода для iOS.
Для реализации iOS я пытаюсь использовать UIImagePickerController для захвата фотографий и последующего сохранения захваченного изображения в файловая система устройства. Моя главная цель — как можно более плавно интегрировать эту функциональность в общий код KMM, чтобы обеспечить возможность повторного использования и согласованность на обеих платформах.
Я сделал попытку, создав CameraManager в iosMain, использующем UIImagePickerController, но у меня возникли проблемы с тем, как правильно сохранить захваченное изображение и передать результат обратно в общий код.
CameraManager выглядит следующим образом:

Код: Выделить всё

actual class CameraManager {
private var onImagePicked: (ByteArray) -> Unit = {}
@Composable
actual fun registerCameraManager(onImagePicked: (ByteArray) -> Unit) {
this.onImagePicked = onImagePicked
}
@OptIn(ExperimentalForeignApi::class)
actual fun takeImage() {
val picker = UIImagePickerController().apply {
sourceType =  UIImagePickerControllerSourceType.UIImagePickerControllerSourceTypeCamera
cameraCaptureMode = UIImagePickerControllerCameraCaptureMode.UIImagePickerControllerCameraCaptureModePhoto
delegate = object : NSObject(), UIImagePickerControllerDelegateProtocol,
UINavigationControllerDelegateProtocol {
override fun imagePickerController(
picker: UIImagePickerController,
didFinishPickingMediaWithInfo: Map
) {
val originalImage = didFinishPickingMediaWithInfo.getValue(
UIImagePickerControllerOriginalImage
) as? UIImage

originalImage?.let { image ->
// Convert image to JPEG data
val data = UIImageJPEGRepresentation(image, 1.0)

// Save to documents directory
val path = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
true
).first().toString()
val filePath = "$path/" + NSUUID.UUID().UUIDString + ".jpg"
data?.writeToFile(filePath, atomically = true)

// Convert to bytes
val bytes = ByteArray(data!!.length.toInt())
//data?.copyBytes(to: bytes)
memcpy(bytes.refTo(0), data!!.bytes, data!!.length)

// Return image bytes
onImagePicked(bytes)
}
picker.dismissViewControllerAnimated(true, null)
}
}
}
UIApplication.sharedApplication.keyWindow?.rootViewController?.presentViewController(
picker, true, null
)
}
}
Объект этого класса создается незадолго до использования в моем UI-компоненте. Там он создан с помощью

Код: Выделить всё

cameraManager.registerCameraManager { imageBytes ->
onEvent(NoteListEvent.OnPhotoPicked(imageBytes))
}

это небольшая вспомогательная функция

Код: Выделить всё

actual fun createCameraManager(): CameraManager {
return remember{
CameraManagerOld(rootController)
}
}
Может ли кто-нибудь помочь мне реализовать такой механизм или поделиться передовым опытом обработки операций камеры и сохранения изображений в приложении KMM? Работать и внедрять фотобиблиотеку на iOS было намного проще.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ges-on-ios
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»