---
title: "在 Android SDK 中使用付费墙启用购买功能"
description: "设置 Adapty 进行应用内订阅管理的快速入门指南。"
---

要启用应用内购买功能，您需要了解三个关键概念：

- [**产品**](product) – 用户可以购买的任何内容（订阅、消耗型商品、永久授权）
- [**付费墙**](paywalls) 是定义要提供哪些产品的配置。在 Adapty 中，付费墙是获取产品的唯一方式，但这种设计让您无需修改应用代码即可更改产品组合、定价和套餐内容。
- [**版位**](placements) – 在应用中展示付费墙的位置和时机（如 `main`、`onboarding`、`settings`）。您在看板中为版位配置付费墙，然后在代码中通过版位 ID 请求它们。这使得运行 A/B 测试以及向不同用户展示不同付费墙变得非常简便。

Adapty 为您提供三种方式来启用应用内购买功能。请根据您的应用需求选择其中一种：

| 实现方式 | 复杂度 | 适用场景 |
|------------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Adapty 付费墙编辑工具 | ✅ 简单 | 您[在无代码编辑工具中创建完整的、支持购买的付费墙](quickstart-paywalls)。Adapty 自动渲染并在幕后处理所有复杂的购买流程、收据验证和订阅管理。 |
| 手动创建付费墙 | 🟡 中等 | 您在应用代码中实现付费墙 UI，但仍从 Adapty 获取付费墙对象以保持产品组合的灵活性。请参阅[指南](android-quickstart-manual)。 |
| 观察者模式 | 🔴 复杂 | 您已有自己的购买处理基础架构并希望继续使用。请注意，观察者模式在 Adapty 中有一定限制。请参阅[文章](observer-vs-full-mode)。 |

:::important
**以下步骤展示如何实现在 Adapty 付费墙编辑工具中创建的付费墙。**

如果您不想使用付费墙编辑工具，请参阅[在手动创建的付费墙中处理购买的指南](android-making-purchases)。
:::

要在应用代码中显示在 Adapty 付费墙编辑工具中创建的付费墙，您只需：

1. **获取付费墙**：从 Adapty 获取付费墙。
2. **展示付费墙，Adapty 将为您处理购买流程**：在应用中显示您获取到的付费墙容器。
3. **处理按钮操作**：将用户与付费墙的交互与应用的响应逻辑关联起来。例如，在用户点击按钮时打开链接或关闭付费墙。

## 开始前的准备 \{#before-you-start\}

在开始之前，请完成以下步骤：

1. 在 Adapty 看板中[将您的应用连接至 Google Play](initial-android)。
2. 在 Adapty 中[创建您的产品](create-product)。
3. [创建付费墙并向其添加产品](create-paywall)。
4. [创建版位并将付费墙添加至版位](create-placement)。
5. 在您的应用代码中[安装并激活 Adapty SDK](sdk-installation-android)。

:::tip
完成这些步骤最快的方式是遵循[快速入门指南](quickstart)，或使用 [Developer CLI](developer-cli-quickstart) 创建付费墙和版位。
:::

## 1. 获取付费墙 \{#1-get-the-paywall\}

您的付费墙与在看板中配置的版位相关联。版位允许您为不同的目标受众运行不同的付费墙，或运行 [A/B 测试](ab-tests)。

要获取在 Adapty 付费墙编辑工具中创建的付费墙，您需要：

1. 使用 `getPaywall` 方法通过[版位](placements) ID 获取 `paywall` 对象，并检查它是否是在编辑工具中创建的付费墙。

2. 使用 `getViewConfiguration` 方法获取付费墙的视图配置。视图配置包含显示付费墙所需的 UI 元素和样式。

:::important
要获取视图配置，您必须在付费墙编辑工具中开启 **Show on device** 开关。否则，您将获得空的视图配置，付费墙将无法显示。
:::

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers
Adapty.getPaywall("YOUR_PLACEMENT_ID") { result ->
    if (result is AdaptyResult.Success) {
        val paywall = result.value
        
        if (!paywall.hasViewConfiguration) {
            return@getPaywall
        }
        
        AdaptyUI.getViewConfiguration(paywall) { configResult ->
            if (configResult is AdaptyResult.Success) {
                val viewConfiguration = configResult.value
            }
        }
    }
}
```
</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers

Adapty.getPaywall("YOUR_PLACEMENT_ID", result -> {
    if (result instanceof AdaptyResult.Success) {
        AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
        
        if (!paywall.hasViewConfiguration()) {
            return;
        }
        
        AdaptyUI.getViewConfiguration(paywall, configResult -> {
            if (configResult instanceof AdaptyResult.Success) {
                AdaptyUI.LocalizedViewConfiguration viewConfiguration =
                    ((AdaptyResult.Success<AdaptyUI.LocalizedViewConfiguration>) configResult).getValue();
                // use loaded configuration
            }
        });
    }
});
```
</TabItem>

</Tabs>

## 2. 展示付费墙 \{#2-display-the-paywall\}

现在，当您拥有付费墙配置后，只需添加几行代码即可展示付费墙。

要在设备屏幕上显示可视化付费墙，您必须首先对其进行配置。为此，请调用 `AdaptyUI.getPaywallView()` 方法或直接创建 `AdaptyPaywallView`：

<Tabs groupId="current-os" queryString>
  <TabItem value="kotlin" label="Kotlin (option 1)" default>

```kotlin showLineNumbers
   val paywallView = AdaptyUI.getPaywallView(
       activity,
       viewConfiguration,
       null, // products = null means auto-fetch
       eventListener,
   )
```
</TabItem>
<TabItem value="kotlin2" label="Kotlin (option 2)" default>

```kotlin showLineNumbers
   val paywallView =
        AdaptyPaywallView(activity) // or retrieve it from xml
   ...
   with(paywallView) {
       showPaywall(
           viewConfiguration,
           null, // products = null means auto-fetch
		   eventListener,
       )
   }
```

</TabItem>
<TabItem value="java" label="Java (option 1)" default>

```java showLineNumbers
AdaptyPaywallView paywallView = AdaptyUI.getPaywallView(
        activity,
        viewConfiguration,
        null, // products = null means auto-fetch
        eventListener,
);
```
</TabItem>
<TabItem value="java2" label="Java (option 2)" default>

```java showLineNumbers
AdaptyPaywallView paywallView =
  new AdaptyPaywallView(activity); //add to the view hierarchy if needed, or you receive it from xml
...
paywallView.showPaywall(viewConfiguration, products, eventListener);
```

</TabItem>
<TabItem value="XML" label="XML" default>

```xml showLineNumbers
<com.adapty.ui.AdaptyPaywallView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```
</TabItem>
</Tabs>

视图成功创建后，您可以将其添加到视图层级并在设备屏幕上显示。

:::tip
有关如何展示付费墙的更多详情，请参阅我们的[指南](android-present-paywalls)。
:::

## 3. 处理按钮操作 \{#3-handle-button-actions\}

当用户点击付费墙中的按钮时，Android SDK 会自动处理购买、恢复、关闭付费墙和打开链接等操作。

但是，其他按钮具有自定义或预定义的 ID，需要在您的代码中处理相应操作。或者，您可能希望覆盖其默认行为。

例如，以下是关闭按钮的默认行为。您不需要在代码中添加它，但在这里您可以看到如有需要应如何实现。

:::tip
阅读我们关于如何处理按钮[操作](android-handle-paywall-actions)和[事件](android-handling-events)的指南。
:::

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers title="Kotlin"
override fun onActionPerformed(action: AdaptyUI.Action, context: Context) {
    when (action) {
        AdaptyUI.Action.Close -> (context as? Activity)?.onBackPressed() // default behavior
    }
}
```
</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers
@Override
public void onActionPerformed(@NonNull AdaptyUI.Action action, @NonNull Context context) {
    if (action instanceof AdaptyUI.Action.Close) {
        if (context instanceof Activity) {
            ((Activity) context).onBackPressed();
        }
    }
}
```
</TabItem>

</Tabs>

## 后续步骤 \{#next-steps\}

---
no_index: true
---
import Callout from '../../../components/Callout.astro';

<Callout type="tip">
有疑问或遇到问题？请访问我们的[支持论坛](https://adapty.featurebase.app/)，您可以在那里找到常见问题的解答，或者提出您自己的问题。我们的团队和社区随时为您提供帮助！
</Callout>

您的付费墙已准备好在应用中展示。[在 Google Play Store 中测试您的购买](testing-on-android)，以确保您可以从付费墙完成测试购买。

接下来，您需要[检查用户的访问等级](android-check-subscription-status)，以确保您向正确的用户展示付费墙或提供付费功能访问权限。

## 完整示例 \{#full-example\}

以下是所有步骤如何在应用中整合的示例。

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers title="Kotlin"
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Adapty.getPaywall("YOUR_PLACEMENT_ID") { paywallResult ->
            if (paywallResult is AdaptyResult.Success) {
                val paywall = paywallResult.value

                if (!paywall.hasViewConfiguration) {
                    // Use custom logic
                    return@getPaywall
                }

                AdaptyUI.getViewConfiguration(paywall) { configResult ->
                    if (configResult is AdaptyResult.Success) {
                        val viewConfiguration = configResult.value

                        val paywallView = AdaptyUI.getPaywallView(
                            this,
                            viewConfiguration,
                            null, // products = null means auto-fetch
                            object : AdaptyUIEventListener {
                                override fun onActionPerformed(action: AdaptyUI.Action, context: Context) {
                                    when (action) {
                                        is AdaptyUI.Action.Close -> {
                                            (context as? Activity)?.onBackPressed()
                                        }
                                    }
                                }
                            }
                        )

                        setContentView(paywallView)
                    }
                }
            }
        }
    }
}

```
</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Adapty.getPaywall("YOUR_PLACEMENT_ID", paywallResult -> {
            if (paywallResult instanceof AdaptyResult.Success) {
                AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) paywallResult).getValue();

                if (!paywall.hasViewConfiguration()) {
                    // Use custom logic
                    return;
                }

                AdaptyUI.getViewConfiguration(paywall, configResult -> {
                    if (configResult instanceof AdaptyResult.Success) {
                        AdaptyUI.LocalizedViewConfiguration viewConfiguration =
                            ((AdaptyResult.Success<AdaptyUI.LocalizedViewConfiguration>) configResult).getValue();

                        AdaptyPaywallView paywallView = AdaptyUI.getPaywallView(
                            this,
                            viewConfiguration,
                            null, // products = null means auto-fetch
                            new AdaptyUIEventListener() {
                               @Override
                                    public void onActionPerformed(@NonNull AdaptyUI.Action action, @NonNull Context context) {
                                        if (action instanceof AdaptyUI.Action.Close) {
                                            if (context instanceof Activity) {
                                                ((Activity) context).onBackPressed();
                                            }
                                        }
                                    }
                            }
                        );

                        setContentView(paywallView);
                    }
                });
            }
        });
    }
}

```
</TabItem>

</Tabs>