-
Notifications
You must be signed in to change notification settings - Fork 15
Open
Description
I was having trouble launching the gallery in cross-platform composition on the Android platform. My problem is that the fragment activity was not initialized when entering the screen with the BindMediaPickerEffect(mediaPicker) method. Solve this problem when change in ComposableActivity() to FragmentActivity() in MainActivity.kt
MainActivity.kt in android package
How to usage moko-media and moko-permissions in compose multiplatform 2024
To use moko-media and moko-permissions in cross-platform composition, follow the steps below:
- 1 - Install dependencys in build.gradle commons packeage
commonMain.dependencies {
// Media File Picker
implementation("com.darkrockstudios:mpfilepicker:3.1.0")
// Moko Permissions
implementation("dev.icerock.moko:permissions:0.17.0")
// Moko Permissions Compose
implementation("dev.icerock.moko:permissions-compose:0.17.0")
// Moko Media Compose
implementation("dev.icerock.moko:media-compose:0.11.0")
}
- 2 - Invoke moko permissions and moko media factory and usage to invoke controller. This controllers method usage in BindEffect( permissions controller) and BindMediaPickerEffect(media controller). Follow this example:
@Composable
fun Content() {
val coroutineScope = rememberCoroutineScope()
val mediaFactory = rememberMediaPickerControllerFactory()
val mediaPicker = remember(mediaFactory) { mediaFactory.createMediaPickerController() }
val permissionFactory: PermissionsControllerFactory = rememberPermissionsControllerFactory()
val permissionController: PermissionsController = remember(permissionFactory) {
permissionFactory.createPermissionsController()
}
BindEffect(permissionController)
BindMediaPickerEffect(mediaPicker)
Button(
onClick = {
ViewModel.openPhoto(
coroutineScope = coroutineScope,
mediaPickerController = mediaPicker,
permissionsController = permissionController
)
}
) {
Text(text = "Click on me")
}
}
in ViewModel, this function usage to open gallary and manipulate show image selected in your screen
class RegisterPhotoScreenModel : ViewModel() {
fun openPhoto(
coroutineScope: CoroutineScope,
mediaPickerController: MediaPickerController,
permissionsController: PermissionsController
) {
coroutineScope.launch {
try {
permissionsController.providePermission(Permission.GALLERY)
val result = mediaPickerController.pickImage(MediaSource.GALLERY)
val imageBitmap = result.toImageBitmap()
// Update your livedata or mutableStateFlow with imageBitmap and colect in screen.
} catch (deniedAlways: DeniedAlwaysException) {
// TODO add snackbar with action button redirect user to config app.
} catch (denied: DeniedException) {
// TODO add snackbar with action button redirect user to config app.
}
}
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels