Skip to content

How usage moko-media and moko-permissions in now update compose multiplatform. Resolve Fragment Activity bugs #75

@maeceloacm1998

Description

@maeceloacm1998

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

image

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:

⚠️⚠️⚠️ ATTENTION: not remove remember to instancy controller, because crash app. ⚠️⚠️⚠️

@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.

            }
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions