{"id":13658622,"url":"https://github.com/icerockdev/moko-media","last_synced_at":"2025-08-11T07:37:53.635Z","repository":{"id":36540481,"uuid":"204862829","full_name":"icerockdev/moko-media","owner":"icerockdev","description":"Media selection \u0026 presenting for mobile (android \u0026 ios) Kotlin Multiplatform development","archived":false,"fork":false,"pushed_at":"2024-05-20T06:01:52.000Z","size":288,"stargazers_count":118,"open_issues_count":21,"forks_count":12,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-09-24T05:02:24.008Z","etag":null,"topics":["android","image","ios","kotlin-multiplatform","kotlin-native","moko","video"],"latest_commit_sha":null,"homepage":"https://moko.icerock.dev/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/icerockdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-28T06:24:32.000Z","updated_at":"2024-09-11T20:52:08.000Z","dependencies_parsed_at":"2024-04-11T03:33:16.290Z","dependency_job_id":"4c368602-b27a-4a2b-91b8-7644d5071c04","html_url":"https://github.com/icerockdev/moko-media","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icerockdev%2Fmoko-media","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icerockdev%2Fmoko-media/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icerockdev%2Fmoko-media/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icerockdev%2Fmoko-media/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/icerockdev","download_url":"https://codeload.github.com/icerockdev/moko-media/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223952549,"owners_count":17230908,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","image","ios","kotlin-multiplatform","kotlin-native","moko","video"],"created_at":"2024-08-02T05:01:01.197Z","updated_at":"2025-08-11T07:37:53.624Z","avatar_url":"https://github.com/icerockdev.png","language":"Kotlin","readme":"![moko-media](img/logo.png)  \n[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/media) ](https://repo1.maven.org/maven2/dev/icerock/moko/media) ![kotlin-version](https://kotlin-version.aws.icerock.dev/kotlin-version?group=dev.icerock.moko\u0026name=media)\n\n# Mobile Kotlin media access\n\nThis is a Kotlin MultiPlatform library that provides media picking in common code (photo/video) and\nvideo player controls.\n\n## Table of Contents\n\n- [Features](#features)\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Samples](#samples)\n- [Set Up Locally](#set-up-locally)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Features\n\n- Capture camera photo\n- Pick image from gallery\n- Control video player\n- **Compose Multiplatform** support\n\n## Requirements\n\n- Gradle version 6.8+\n- Android API 16+\n- iOS version 11.0+\n\n## Installation\n\nroot build.gradle\n\n```groovy\nallprojects {\n    repositories {\n        mavenCentral()\n        maven { url = uri(\"https://jitpack.io\") }\n    }\n}\n```\n\nproject build.gradle\n\n```groovy\ndependencies {\n    commonMainApi(\"dev.icerock.moko:media:0.11.1\")\n\n    // Compose Multiplatform\n    commonMainApi(\"dev.icerock.moko:media-compose:0.11.1\")\n\n    commonTestImplementation(\"dev.icerock.moko:media-test:0.11.1\")\n}\n```\n\n## Usage\n\n```kotlin\nclass ViewModel(val mediaController: MediaPickerController) : ViewModel() {\n    fun onSelectPhotoPressed() {\n        launch {\n            try {\n                val bitmap = mediaController.pickImage(MediaControllerSource.CAMERA)\n                // captured photo in bitmap\n            } catch (_: CanceledException) {\n                // cancel capture\n            } catch (error: Throwable) {\n                // denied permission or file read error\n            }\n        }\n    }\n}\n```\n\nandroid:\n\n```kotlin\nval viewModel = getViewModel {\n    val permissionsController = PermissionsController()\n    val mediaController = MediaPickerController(permissionsController)\n    ViewModel(mediaController)\n}\n\nviewModel.mediaController.bind(\n    lifecycle,\n    supportFragmentManager\n) // permissioncController bind automatically\n```\n\niOS:\n\n```swift\nlet permissionsController = PermissionsController()\nlet mediaController = MediaPickerController(permissionsController: permissionsController, viewController: self)\nlet viewModel = ViewModel(mediaController: mediaController)\n```\n\n### Compose Multiplatform\n\n```kotlin\n@Composable\nfun Sample() {\n    val factory = rememberMediaPickerControllerFactory()\n    val picker = remember(factory) { factory.createMediaPickerController() }\n    val coroutineScope = rememberCoroutineScope()\n\n    BindMediaPickerEffect(picker)\n\n    var image: ImageBitmap? by remember { mutableStateOf(null) }\n\n    image?.let {\n        Image(bitmap = it, contentDescription = null)\n    }\n\n    Button(\n        onClick = {\n            coroutineScope.launch {\n                val result = picker.pickImage(MediaSource.GALLERY)\n                image = result.toImageBitmap()\n            }\n        }\n    ) {\n        Text(text = \"Click on me\")\n    }\n}\n```\n\nor with moko-mvvm (with correct configuration change on android):\n\n```kotlin\n@Composable\nfun Sample() {\n    val factory = rememberMediaPickerControllerFactory()\n    val viewModel: SampleViewModel = getViewModel(\n        key = \"sample\",\n        factory = viewModelFactory {\n            val picker = factory.createMediaPickerController()\n            SampleViewModel(picker)\n        }\n    )\n\n    BindMediaPickerEffect(viewModel.mediaPickerController)\n\n    val image: Bitmap? by viewModel.image.collectAsState()\n    val imageBitmap: ImageBitmap? = remember(image) { image?.toImageBitmap() }\n\n    imageBitmap?.let {\n        Image(bitmap = it, contentDescription = null)\n    }\n\n    Button(onClick = viewModel::onButtonClick) {\n        Text(text = \"Click on me\")\n    }\n}\n\nclass SampleViewModel(\n    val mediaPickerController: MediaPickerController\n) : ViewModel() {\n    private val _image: MutableStateFlow\u003cBitmap?\u003e = MutableStateFlow(null)\n    val image: StateFlow\u003cBitmap?\u003e get() = _image\n\n    fun onButtonClick() {\n        viewModelScope.launch {\n            try {\n                _image.value = mediaPickerController.pickImage(MediaSource.GALLERY)\n            } catch (exc: Exception) {\n                println(\"error $exc\")\n            }\n        }\n    }\n}\n```\n\n## Samples\n\nMore examples can be found in the [sample directory](sample).\n\n## Set Up Locally\n\n- In [media directory](media) contains `media` library;\n- In [sample directory](sample) contains samples on android, ios \u0026 mpp-library connected to apps.\n\n## Contributing\n\nAll development (both new features and bug fixes) is performed in `develop` branch. This\nway `master` sources always contain sources of the most recently released version. Please send PRs\nwith bug fixes to `develop` branch. Fixes to documentation in markdown files are an exception to\nthis rule. They are updated directly in `master`.\n\nThe `develop` branch is pushed to `master` during release.\n\nMore detailed guide for contributers see in [contributing guide](CONTRIBUTING.md).\n\n## License\n\n    Copyright 2019 IceRock MAG Inc\n    \n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n    \n       http://www.apache.org/licenses/LICENSE-2.0\n    \n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","funding_links":[],"categories":["Libraries"],"sub_categories":["📱 Device"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficerockdev%2Fmoko-media","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficerockdev%2Fmoko-media","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficerockdev%2Fmoko-media/lists"}