Skip to content
Advertisement

registerForActivityResult is not working in Flutter

I’m trying to launch context from android MainActivity class to flutter. code :

val authResult = ComponentActivity().registerForActivityResult(PianoIdAuthResultContract()) { r ->
                when (r) {
                    null -> { /* user cancelled Authorization process */ }
                    is PianoIdAuthSuccessResult -> {
                        val token = r.token
                        val isNewUserRegistered = r.isNewUser
                        if (token != null) {
                            if (token.emailConfirmationRequired) {
                                // process enabled Double opt-in
                            }
                        }
                        // process successful authorization
                    }
                    is PianoIdAuthFailureResult -> {
                        val e = r.exception
                        // Authorization failed, check e.cause for details
                    }
                }
            }

and then calling the method launch code :

            try{
                authResult.launch(PianoId.signIn());
            }catch (e : Exception){
                val text = e.message
                val duration = Toast.LENGTH_SHORT

                val toast = Toast.makeText(applicationContext, text, duration)
                toast.show()
            }

and then I call this method from flutter by creating a channel between flutter and android and invoke it :

signInChannel.invokeMethod('testSignIn');

when I press the sign in button it shows me this exception :

Attempt to invoke virtual method ‘android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()’ on a null object reference

Advertisement

Answer

I too was searching for the solution. what i did was extend MainActivity with FlutterFragmentActivity and pass this to method channel handler.

    public class MainActivity extends FlutterFragmentActivity{
           ...
           @Override
           public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) 
           {
              handlePickerMethodChannel(flutterEngine);
           }
        

        private void handlePickerMethodChannel(FlutterEngine flutterEngine) {
            PickerMethodChannelHandler PickerMethodChannelHandler = new PickerMethodChannelHandler(new WeakReference<>(this));
            new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), PHOTO_PICKER_METHOD_CHANNEL)
                    .setMethodCallHandler(pickerMethodChannelHandler);
        }
    }

class PickerMethodChannelHandler(
    private val activity: WeakReference<Activity>,
) : MethodChannel.MethodCallHandler {

    private val pickMedia = (activity.get() as ComponentActivity).registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
        if (uri != null) {
            Log.d("PhotoPicker", "Selected URI: $uri")
        } else {
            Log.d("PhotoPicker", "No media selected")
        }
    }

    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        when (call.method) {
            "pickMedia" -> pickMedia(call,result)
            else -> result.notImplemented()
        }
    }

    private fun pickMedia(call: MethodCall, result: MethodChannel.Result) {
        val context = activity.get() as ComponentActivity

        Log.i("PICK_MEDIA","PICK ${context != null}")
        pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
    }

}

It worked

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement