Как открыть ссылки в приложении: краткий план действий

Чтобы настроить открытие ссылок в Android, используйте два механизма: Custom URI Scheme (myapp://...) для внутренних сценариев и App Links (HTTPS + autoVerify) для публичного трафика. Ниже — конкретные шаги, примеры манифеста, обработка Intent и способы тестирования.

App Scheme (Custom URI): быстрый пример и обработка

App Scheme предназначен для ситуаций, когда вы контролируете отправителя ссылок (push, email внутри продукта). В манифесте добавьте intent-filter для Activity:

<activity android:name=".ProfileActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="myapp" android:host="profile"/>
  </intent-filter>
</activity>

В Activity получите данные из intent:

val uri = intent?.data
if (uri != null && uri.scheme == "myapp") {
  val userId = uri.getQueryParameter("user")
  // Переход на экран профиля: загрузить данные по userId
}

Тест в ADB:

adb shell am start -W -a android.intent.action.VIEW -d "myapp://profile?user=123" com.yourpackage

Не используйте только scheme без host — начиная с Android 12 это ненадежно и может привести к конфликтам. Всегда указывайте host и по возможности path.

App Links позволяют открывать https://example.com/... прямо в приложении и проходят верификацию у Android. Шаги:

  1. В манифесте добавьте intent-filter с https и android:autoVerify="true":
<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:scheme="https" android:host="example.com" android:pathPrefix="/product/"/>
</intent-filter>
  1. На сервере сайта разместите файл assetlinks.json (в корне .well-known):
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.yourpackage",
    "sha256_cert_fingerprints": ["14:6D:CB:..."]
  }
}]

Fingerprint получите через keytool:

keytool -list -v -keystore your.keystore
  1. После публикации и установки приложение будет автоматически ассоциировано, если отпечатки и package совпадают.

Тестирование: откройте ссылку в терминале или браузере на устройстве; также проверьте статус в Settings → Apps → Opening links или через adb:

adb shell pm get-package-restrictions com.yourpackage

Практические рекомендации и продвинутые фичи

  • Для уведомлений используйте PendingIntent с Intent.ACTION_VIEW и нужным URI; для навигации в архитектуре Jetpack применяйте NavDeepLinkBuilder.
  • При мульти‑Activity/роутинге сначала распарсьте URI в Launcher Activity и используйте NavController/resolveActivity для корректного перехода.
  • Обновляйте sha256‑fingerprint при смене ключа подписи (релиз/стейдж).

Тестируйте оба сценария: ссылка открывает приложение, если установлено, и корректно падает в браузер (fallback) если нет.

Частые ошибки

  • Не открывается: intent-filter не совпадает по host/path — проверьте точное значение.
  • AutoVerify не сработал: assetlinks.json отсутствует или fingerprint неверный.
  • Несколько приложений перехватывают одну ссылку: используйте уникальные хосты или уточняйте pathPrefix.
  • Ожидание параметров: всегда валидируйте query-параметры и добавьте fallback-логику.

FAQ

  • Как отлаживать, если ссылка не попадает в приложение? Проверьте adb logcat на Intent‑события, запустите adb am start с URI, убедитесь в уникальности host и наличии BROWSABLE категории.

  • Нужно ли всегда ставить autoVerify="true"? Рекомендуется для публичных ссылок (App Links). Для внутренних схем оставьте false и используйте Custom URI.

  • Что делать, если после релиза сменился ключ подписи? Обновите sha256 в assetlinks.json и разверните на сайте; для пользователей может потребоваться переустановка для обновления ассоциации.

  • Как обеспечить fallback в браузер? Если App Link не ассоциирован, система откроет ссылку в браузере. Для Custom URI реализуйте на стороне отправителя проверку и ссылку на веб‑страницу как запасной вариант.


Настройка обычно занимает 2–4 часа: добавление intent-filter, обработка intent в коде и проверка assetlinks.json. При правильной настройке пользовательский путь становится короче, а вовлеченность и удержание растут.