---
title: Resuming journeys using magic links on Android
description: Learn how to suspend and resume authentication journeys using magic links in your Android application.
component: orchsdks
page_id: orchsdks:journey:use-cases/magic-links/android-magic-links
canonical_url: https://developer.pingidentity.com/orchsdks/journey/use-cases/magic-links/android-magic-links.html
revdate: Thu, 19 Feb 2026 14:24:00 +0000
keywords: ["PingOne Advanced Identity Cloud", "PingAM", "Journeys", "Android", "Magic Links", "Suspended Authentication", "Resume", "Deep Links", "App Links", "Setup &amp; Configuration", "Source Code", "Use Case", "SDK"]
section_ids:
  capture_uri: Step 1. Capturing the resume URI
  resume_journey: Step 2. Resuming a suspended authentication journey
---

# Resuming journeys using magic links on Android

[icon: circle-check, set=far]PingOne Advanced Identity Cloud [icon: circle-check, set=far]PingAM [icon: android, set=fab]Android

To resume a journey in an Android app, complete the following tasks:

* [Step 1. Capturing the resume URI](#capture_uri)

  Configure your Android application to launch when the user clicks the magic link in their email.

  After launching, capture the URI that was clicked so you can resume authentication.

* [Step 2. Resuming a suspended authentication journey](#resume_journey)

  Pass the captured URI into the `journey.resume()` method to continue the journey, rather than calling `journey.start()` to start again.

## Step 1. Capturing the resume URI

Your application must capture the resume URI that the server emails to the user. That URI contains a unique `suspendedId` parameter that it uses to resume the user's journey on the server.

You must register your Android app to launch when the user clicks the resume URI, so that they can continue their journey in your app. If you don't register an app to handle the resume URI, clicking a magic link launches your server's login UI in a browser instead.

|   |                                                                                                                                                                                                                                       |
| - | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|   | We recommend using either [deep links](https://developer.android.com/training/app-links/create-deeplinks), or [app links](https://developer.android.com/training/app-links/about) to associate your Android app with your resume URI. |

Your app should capture the URI value that opened it, as you'll need to pass that value back to your server to resume the authentication journey:

Example of capturing the resume URI that opened an Android app

```kotlin
// In Activity or ViewModel handling deep links
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val resumeUri: Uri? = intent?.data
}
```

## Step 2. Resuming a suspended authentication journey

After obtaining the `resumeUri`, use it in your application to continue the user's authentication or registration journey.

Use the **Journey** module's `resume()` method, rather than `start()`, to continue the journey using the `resumeUri` as follows:

Resuming a journey on Android

```kotlin
var node = journey.resume("resumeUri")

// Handle nodes just like starting new journey…​
when (node) {
    is ContinueNode -> {
        // Proceed to the next step in the authentication journey
        val nextNode = node.next()
    }
    is ErrorNode -> {
        // Handle server-side errors (e.g., invalid credentials)
        val errorMessage = node.message
        node.input["name"] // Access the raw JSON response with the input attribute
        // Display error to the user
    }
    is FailureNode -> {
        // Handle unexpected errors (e.g., network issues, unexpected errors like parsing response)
        val errorCause = node.cause
        // Log the error and potentially display a generic message
    }
    is SuccessNode -> {
        // Authentication successful, retrieve the session
        val session = node.session
        node.input["name"] // Access the raw JSON response with the input attribute
        // Proceed with post-authentication actions
    }
}
```

|   |                                                                                                                                        |
| - | -------------------------------------------------------------------------------------------------------------------------------------- |
|   | If the URI scheme, host, or port in the `resumeUri` does not match the server configured for the journey, the SDK throws an exception. |
