---
title: "Adapty Android SDK'yı v. 4.0'a Geçirme"
description: "Adapty Android SDK v4.0'a geçiş yapın: paywall API'lerini flow API'leriyle değiştirin; hem Flow Builder hem de Paywall Builder ile uyumludur."
---

Adapty Android SDK 4.0, flow'ları tanıtır ve paywall API'lerini buna göre yeniden adlandırır. Yeni API'ler hem yeni Flow Builder hem de mevcut Paywall Builder ile çalışır; Adapty Kontrol Paneli tarafında herhangi bir kurulum değişikliği gerekmez.

## Hızlı referans \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId, locale)` | `Adapty.getFlow(placementId)` |
| `Adapty.getPaywallForDefaultAudience(placementId, locale)` | `Adapty.getFlowForDefaultAudience(placementId)` |
| `AdaptyUI.getViewConfiguration(paywall)` | `AdaptyUI.getFlowConfiguration(flow, locale)` |
| `AdaptyUI.LocalizedViewConfiguration` | `AdaptyUI.FlowConfiguration` |
| `Adapty.getPaywallProducts(paywall)` | `Adapty.getPaywallProducts(flow)` |
| `Adapty.logShowPaywall(paywall)` | `Adapty.logShowFlow(flow)` |
| `AdaptyPaywall` | `AdaptyFlow` |
| `AdaptyUI.getPaywallView(...)` | `AdaptyUI.getFlowView(...)` |
| `AdaptyPaywallView` | `AdaptyFlowView` |
| `AdaptyPaywallScreen` (Compose) | `AdaptyFlowScreen` |
| `showPaywall(...)` | `showFlow(...)` |
| `AdaptyPaywallInsets` | `AdaptyFlowInsets` |
| `AdaptyUiEventListener` | `AdaptyFlowEventListener` |
| `AdaptyUiDefaultEventListener` | `AdaptyFlowDefaultEventListener` |
| `onPaywallShown` / `onPaywallClosed` | `onFlowShown` / `onFlowClosed` |
| `onRenderingError` | `onError` |
| `Adapty.updateAttribution(attribution, source)` (`source: String`) | `Adapty.updateAttribution(attribution, source)` (`source: AdaptyAttributionSource`) |
| `Adapty.setIntegrationIdentifier(key, value)` | `Adapty.setIntegrationIdentifier(AdaptyIntegrationIdentifier)` |
`AdaptyPaywallProduct` adını korur — ürünler hâlâ bir flow'a aittir ve `getPaywallProducts` artık bir `AdaptyFlow` alır. Diğer `AdaptyFlowEventListener` metotları (`onProductSelected`, `onPurchaseStarted`, `onPurchaseFinished`, `onPurchaseFailure`, `onRestoreSuccess`, `onRestoreFailure`, `onActionPerformed`, `onAwaitingPurchaseParams`, `onLoadingProductsFailure` ve diğerleri) adlarını ve imzalarını korur.
## Kurulum \{#installation\}

`adapty-bom` sürümünü `4.0.0` (veya daha yenisi) olarak ayarlayın ve projeyi senkronize edin. BOM, sizin için uygun `android-sdk` ve `android-ui` sürümlerini otomatik olarak belirler. Bağımlılık tanımlamaları için [Adapty SDK'yı Yükleyin](sdk-installation-android) sayfasına bakın.

## Kaldırılan ve kullanımdan kaldırılan API'ler \{#removed-and-deprecated-apis\}

- **`Adapty.makePurchase(activity, product, subscriptionUpdateParams, isOfferPersonalized, callback)`** — kaldırıldı. Bu aşırı yükleme v3'te kullanımdan kaldırılmıştı. Aynı seçenekleri bunun yerine `AdaptyPurchaseParameters` üzerinden iletin:
```diff showLineNumbers
- Adapty.makePurchase(activity, product, subscriptionUpdateParams, isOfferPersonalized) { result -> /* ... */ }
+ val params = AdaptyPurchaseParameters.Builder()
+     .withSubscriptionUpdateParams(subscriptionUpdateParams)
+     .withOfferPersonalized(isOfferPersonalized)
+     .build()
+ Adapty.makePurchase(activity, product, params) { result -> /* ... */ }
```

- **Onboardinglar artık kullanım dışı.** `AdaptyUI.getOnboardingView` ve `AdaptyUI.getOnboardingConfiguration`, 4.0'da `@Deprecated` olarak işaretlendi — onboardinglarınızı [Flow Builder](adapty-flow-builder)'da oluşturulan flow'lara taşıyın.
## Flow'ları getirme \{#fetching-flows\}
### getPaywall + getViewConfiguration → getFlow + getFlowConfiguration

Getirme işleminin dönüş türü `AdaptyPaywall`'dan `AdaptyFlow`'a değişiyor; yapılandırma yükleyicisi ise `AdaptyUI.getViewConfiguration`'dan `AdaptyUI.getFlowConfiguration`'a yeniden adlandırılıyor (`AdaptyUI.LocalizedViewConfiguration` yerine `AdaptyUI.FlowConfiguration` döndürüyor). `locale` parametresi, getirme çağrısından `getFlowConfiguration`'a taşınıyor:
```diff showLineNumbers
- Adapty.getPaywall("YOUR_PLACEMENT_ID", locale = "en") { result ->
+ Adapty.getFlow("YOUR_PLACEMENT_ID") { result ->
      if (result is AdaptyResult.Success) {
-         val paywall = result.value
-         if (!paywall.hasViewConfiguration) return@getPaywall
-         AdaptyUI.getViewConfiguration(paywall) { configResult ->
+         val flow = result.value
+         if (!flow.hasViewConfiguration) return@getFlow
+         AdaptyUI.getFlowConfiguration(flow, locale = "en") { configResult ->
              if (configResult is AdaptyResult.Success) {
                  val flowConfiguration = configResult.value
              }
          }
      }
  }
```

### getPaywallProducts(paywall) → getPaywallProducts(flow)

`getPaywallProducts` artık `Adapty.getFlow` tarafından döndürülen bir `AdaptyFlow` alıyor:

```diff showLineNumbers
- Adapty.getPaywallProducts(paywall) { result -> /* products */ }
+ Adapty.getPaywallProducts(flow) { result -> /* products */ }
```
## Flow görüntülemelerini takip etme \{#tracking-flow-views\}
### logShowPaywall → logShowFlow

`logShowPaywall`, `logShowFlow` olarak yeniden adlandırıldı ve artık `AdaptyPaywall` yerine `AdaptyFlow` alıyor. Etkinlik hâlâ aynı varyasyona karşı kaydedildiğinden, mevcut huni ve A/B testi metrikleri kontrol panelinde herhangi bir değişiklik yapılmadan çalışmaya devam eder.

```diff showLineNumbers
- Adapty.logShowPaywall(paywall)
+ Adapty.logShowFlow(flow)
```

v3'te olduğu gibi, [Flow Builder](adapty-flow-builder) veya [Paywall Builder](adapty-paywall-builder) tarafından oluşturulan flow'ları ya da paywall'ları görüntülerken bu metodu çağırmanıza gerek yoktur — Adapty bu görüntülemeleri otomatik olarak takip eder.
## Flow'ları görüntüleme \{#displaying-flows\}
### getPaywallView / AdaptyPaywallView → getFlowView / AdaptyFlowView

Factory metodunu ve view türünü yeniden adlandırın, ardından `AdaptyUI.FlowConfiguration`'ı geçirin:

```diff showLineNumbers
- val paywallView = AdaptyUI.getPaywallView(
-     activity,
-     viewConfiguration,
-     products,
-     eventListener,
- )
+ val flowView = AdaptyUI.getFlowView(
+     activity,
+     flowConfiguration,
+     products,
+     eventListener,
+ )
```

View'ı doğrudan oluşturuyorsanız, show metodu da yeniden adlandırılmıştır:
```diff showLineNumbers
- val paywallView = AdaptyPaywallView(activity)
- paywallView.showPaywall(viewConfiguration, products, eventListener)
+ val flowView = AdaptyFlowView(activity)
+ flowView.showFlow(flowConfiguration, products, eventListener)
```

XML layout'larında view tag'ini güncelleyin:

```diff showLineNumbers
- <com.adapty.ui.AdaptyPaywallView ... />
+ <com.adapty.ui.AdaptyFlowView ... />
```
İsteğe bağlı `personalizedOfferResolver` parametresi `getFlowView` / `showFlow` / `AdaptyFlowScreen`'den kaldırıldı. Kişiselleştirilmiş fiyatlandırmayı belirtmek için `onAwaitingPurchaseParams` aracılığıyla her ürün için ayrı ayrı ayarlayın (`AdaptyPurchaseParameters.Builder().withOfferPersonalized(true)`). Yeni isteğe bağlı `customAssets` parametresi, görselleri ve videoları çalışma zamanında geçersiz kılmanıza olanak tanır — bkz. [Özel asset'ler](android-get-pb-paywalls#customize-assets).
### AdaptyPaywallScreen → AdaptyFlowScreen

Jetpack Compose'da composable'ı yeniden adlandırın ve konfigürasyon parametresini güncelleyin:

```diff showLineNumbers
- AdaptyPaywallScreen(
-     viewConfiguration,
+ AdaptyFlowScreen(
+     flowConfiguration,
      products,
      eventListener,
  )
```
## Olayları Yönetme \{#handling-events\}

Olay dinleyicisi `AdaptyUiEventListener`'dan `AdaptyFlowEventListener`'a (ve `AdaptyUiDefaultEventListener`'dan `AdaptyFlowDefaultEventListener`'a) yeniden adlandırıldı. Metot adlarının çoğu değişmedi; yaşam döngüsü ve render callback'leri yeniden adlandırıldı:
```diff showLineNumbers
- class YourListener : AdaptyUiDefaultEventListener() {
+ class YourListener : AdaptyFlowDefaultEventListener() {

-     override fun onPaywallShown(context: Context) {}
-     override fun onPaywallClosed() {}
+     override fun onFlowShown(context: Context) {}
+     override fun onFlowClosed() {}

-     override fun onRenderingError(error: AdaptyError, context: Context) {}
+     override fun onError(error: AdaptyError, context: Context) {}
  }
```

Mevcut handler gövdelerinde kod değişikliği gerekmez — sadece türü ve override'ları yeniden adlandırın. `onError`, `onRenderingError`'ın tetiklendiği rendering hatalarının yanı sıra diğer satın alma dışı runtime hatalarında da tetiklenir. Callback'lerin tam listesi için bkz. [Flow & paywall olaylarını yönetme](android-handling-events).
v4 ayrıca bir `onBackPressed(context): Boolean` callback'i ekler ve varsayılan davranışı sistem geri tuşunun nasıl çalıştığını değiştirir. Önceden geri tuşuna basmak (veya geri gesturı) aktivitenize ya da fragment'ınıza geçer ve genellikle paywall'ı kapatırdı. v4'te varsayılan uygulama bu basışı tüketir; dolayısıyla **sistem geri tuşu artık bir flow'u kendi başına kapatmaz** — flow'un sistem gesturıyla kapatılamadığı iOS davranışıyla aynı hizaya gelir. Kullanıcılara açık bir çıkış yolu sunun (bir **Close** düğmesi veya bir `on_device_back` aksiyonu) ya da eski davranışı geri kazanmak için `onBackPressed`'i `false` döndürecek şekilde geçersiz kılın. Ayrıntılar için [Sistem geri tuşu](android-handling-events#system-back-button) bölümüne bakın.
Varsayılan satın alma işleyicisi artık ekranı kapatmayı da durduruyor. v3'te, varsayılan `onPurchaseFinished`, kullanıcının iptal etmediği her tamamlanmış satın almanın (başarılı veya beklemedeki satın alma) ardından paywallı kapatıyordu. v4'te bu işlem hiçbir şey yapmıyor, dolayısıyla **siz kapatana kadar bir flow, satın alma sonrasında açık kalıyor** — bu da iOS davranışıyla örtüşüyor. Bu otomatik kapanmaya güveniyorsanız, satın alma tamamlandığında ekranı kendiniz kapatın. Örnek için [Başarılı, iptal edilmiş veya beklemedeki satın alma](android-handling-events#successful-canceled-or-pending-purchase) konusuna bakın.
## Attribution ve entegrasyon tanımlayıcıları \{#attribution-and-integration-identifiers\}
### updateAttribution

`source` parametresi `String` türünden yeni `AdaptyAttributionSource` türüne değişti ve `attribution` artık `Map<String, Any>` türünde (JSON `String` aşırı yüklemesi de mevcuttur). Önceden tanımlanmış kaynaklardan birini kullanın:

```diff showLineNumbers
- Adapty.updateAttribution(attribution, "appsflyer") { error -> /* handle the error */ }
+ Adapty.updateAttribution(attribution, AdaptyAttributionSource.APPSFLYER) { error -> /* handle the error */ }
```
Önceden tanımlanmış kaynaklar: `AdaptyAttributionSource.APPLE_ADS`, `.ADJUST`, `.APPSFLYER`, `.BRANCH`, `.TENJIN`. Diğer kaynaklar için bir dizeden oluşturun: `AdaptyAttributionSource("your_source")`.
### setIntegrationIdentifier

`setIntegrationIdentifier(key, value)`, bir veya daha fazla `AdaptyIntegrationIdentifier` değeri alan bir yöntemle değiştirilmiştir. Ham bir string key geçirmek yerine, her tanımlayıcıyı bir kolaylık yöntemiyle oluşturun:

```diff showLineNumbers
- Adapty.setIntegrationIdentifier("appsflyer_id", appsFlyerId) { error -> /* handle the error */ }
+ Adapty.setIntegrationIdentifier(AdaptyIntegrationIdentifier.appsflyerId(appsFlyerId)) { error -> /* handle the error */ }
```

Tek bir çağrıda birden fazla tanımlayıcı ayarlayabilirsiniz:
```kotlin showLineNumbers
Adapty.setIntegrationIdentifier(
    listOf(
        AdaptyIntegrationIdentifier.appsflyerId(appsFlyerId),
        AdaptyIntegrationIdentifier.adjustDeviceId(adjustDeviceId),
    )
) { error -> /* handle the error */ }
```

Eski her anahtar dizesini ilgili kolaylık metoduyla değiştirin:
| v3 anahtarı | v4 `AdaptyIntegrationIdentifier` metodu |
|---|---|
| `"adjust_device_id"` | `adjustDeviceId(value)` |
| `"airbridge_device_id"` | `airbridgeDeviceId(value)` |
| `"amplitude_user_id"` | `amplitudeUserId(value)` |
| `"amplitude_device_id"` | `amplitudeDeviceId(value)` |
| `"appmetrica_device_id"` | `appmetricaDeviceId(value)` |
| `"appmetrica_profile_id"` | `appmetricaProfileId(value)` |
| `"appsflyer_id"` | `appsflyerId(value)` |
| `"branch_id"` | `branchId(value)` |
| `"facebook_anonymous_id"` | `facebookAnonymousId(value)` |
| `"firebase_app_instance_id"` | `firebaseAppInstanceId(value)` |
| `"mixpanel_user_id"` | `mixpanelUserId(value)` |
| `"one_signal_subscription_id"` | `oneSignalSubscriptionId(value)` |
| `"one_signal_player_id"` | `oneSignalPlayerId(value)` |
| `"posthog_distinct_user_id"` | `posthogDistinctUserId(value)` |
| `"pushwoosh_hwid"` | `pushwooshHWID(value)` |
| `"tenjin_analytics_installation_id"` | `tenjinAnalyticsInstallationId(value)` |
`AdaptyIntegrationIdentifier(AdaptyIntegrationIdentifier.Key("custom"), customValue)` şeklinde özel bir `Key` kullanarak bu listede olmayan bir anahtar için identifier'ı doğrudan oluşturabilirsiniz.