https://kotlinlang.org logo
Title
j

Justin Xu

05/10/2023, 7:06 AM
I'm using
moko-media
and
moko-permissions
in Compose Multiplatform to open the gallery and select a photo. However, I'm getting a
dev.icerock.moko.permissions.DeniedAlwaysException
error when I call the following code:
val mediaFactory = rememberMediaPickerControllerFactory()
val picker = remember(mediaFactory) {  
    mediaFactory.createMediaPickerController() 
}
val coroutineScope = rememberCoroutineScope()

BindMediaPickerEffect(picker)

...

coroutineScope.launch {
    picker.permissionsController.providePermission(Permission.GALLERY)
    if (picker.permissionsController.isPermissionGranted(Permission.GALLERY)) {
        setProfilePictureBitmap(picker.pickImage(MediaSource.GALLERY))
    }
    ...
}
I check my app details on the emulator and it says that Photos and Videos are allowed, not sure what the cause of the issue is. Full error details in replies
dev.icerock.moko.permissions.DeniedAlwaysException
	at dev.icerock.moko.permissions.ResolverFragment.requestPermissionLauncher$lambda$1(ResolverFragment.kt:47)
	at dev.icerock.moko.permissions.ResolverFragment.$r8$lambda$xVWh1OMY-jV8sGm90Z_Lnoc0rAA(Unknown Source:0)
	at dev.icerock.moko.permissions.ResolverFragment$$ExternalSyntheticLambda0.onActivityResult(Unknown Source:4)
	at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:418)
	at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:375)
	at androidx.activity.ComponentActivity.onRequestPermissionsResult(ComponentActivity.java:844)
	at androidx.fragment.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:490)
	at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8774)
	at android.app.Activity.dispatchActivityResult(Activity.java:8632)
	at android.app.ActivityThread.deliverResults(ActivityThread.java:5316)
	at android.app.ActivityThread.handleSendResult(ActivityThread.java:5362)
	at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:67)
	at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7872)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
	Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@c23aafc, androidx.compose.runtime.BroadcastFrameClock@430c585, StandaloneCoroutine{Cancelling}@ed0cfda, AndroidUiDispatcher@ad91c0b]
e

ephemient

05/10/2023, 7:42 AM
looks like Android, so 1. did you update your app manifest? 2. consider using https://developer.android.com/training/data-storage/shared/photopicker instead, it's easier to integrate and a better user experience IMO
j

Justin Xu

05/10/2023, 10:00 AM
This is for Compose multiplatform, and if you're talking about adding permissions to manifest then yes I have
a

alex009

05/12/2023, 5:47 AM
hi @Justin Xu. can you create reproducer project ? and compare your project with https://github.com/icerockdev/moko-compose-multiplatform-ios-android-template
j

Justin Xu

05/12/2023, 11:20 PM
@alex009 Here is a reproducer, calls the media picker using the same code I posted above.
a

alex009

05/16/2023, 8:20 AM
hi @Justin Xu. i create PR with fix.
j

Justin Xu

05/16/2023, 7:36 PM
Works great now, thanks so much! Really appreciate all of the multiplatform tools you make