deprecated OnActivityResult() in androidx
Asked Answered
N

1

12

OnActivityResult() is deprecated in androidx. I took reference from below links

I implemented for signup thing in my project ..like .I created resultcontract by registering the activity in place of startActivityForResult i replaced by resultcontract.launch(intent) and getting result in resultcontract (followed above links). Now i have doubt in one function that is turn on gps. for this we have used

val rae = e as ResolvableApiException
rae.startResolutionForResult(context, GPS_REQUEST)

earlier it was startActivityForResult , now it is startResolutionForResult having confusion how to get result of gps request ( in code , we are getting result in onActivityResult).how can i implement this using new way?

Niu answered 5/12, 2020 at 14:59 Comment(3)
I'm having the same issue, how do we implement this now? Have you found the solution?Smackdab
No , i am still searching for the solution. If you find any ,please let me know. Thanks.Niu
startResolutionForResult() uses onActivityResult to notify it, and we can't replace it to provide an equal solution using the new way of Intents. So I'm keeping the same solution for now! I tried my best but can't find another way. SorrySmackdab
S
37

I found a solution for this problem, using the recent API's to start something for result.

So, you can pretty much get the resolution from ResolvableApiException, which is a PendingIntent, and start it with StartIntentSenderForResult contract, like this

contract:

private val resolutionForResult = registerForActivityResult(
    ActivityResultContracts.StartIntentSenderForResult()
) { activityResult ->

    // do whatever you want with activity result...

}

how to start:

.addOnFailureListener { exception ->
    if (exception is ResolvableApiException) {
        try {
            val intentSenderRequest = IntentSenderRequest
                    .Builder(exception.resolution).build()
            resolutionForResult.launch(intentSenderRequest)
        } catch (throwable: Throwable) {
            // Ignore the error.
        }
    }
}
Swordplay answered 28/1, 2021 at 18:35 Comment(4)
Okay. , and if you consider my above code, then how to pass GPS Request?Niu
you dont need GPS_REQUEST constant doing by this way, since resolutionForResult contract is created specific to get result of IntentSender. this callback give you a ActivityResult which have your data(Intent) and resultCode(Int). I'm just doing this on callback private val resolutionForResult = fragmentActivity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult -> if (activityResult.resultCode == Activity.RESULT_OK) { startRequestLocationUpdates() } }Swordplay
Ok, i got it. Thank you so much Gustavo. one more doubt for AutoResolveHelper.resolveTask(task, requireActivity(), SAVE_TO_WALLET) this one we are sending for SAVE_TO_WALLET request and getting it result in onActivityResult , if (requestCode == SAVE_TO_WALLET) { sendActivityResult(requestCode, resultCode, data) } how can we achieve this using new method?Niu
Didn't work when I initialized callback inside a fragment method, so use class-level declaration only!Vltava

© 2022 - 2024 — McMap. All rights reserved.