Для реализации 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
)
}
}
Код: Выделить всё
cameraManager.registerCameraManager { imageBytes ->
onEvent(NoteListEvent.OnPhotoPicked(imageBytes))
}
Код: Выделить всё
actual fun createCameraManager(): CameraManager {
return remember{
CameraManagerOld(rootController)
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... ges-on-ios
Мобильная версия