在 Android SDK 中使用 Flow 与付费墙编辑工具启用购买功能 要启用应用内购买,你需要了解三个核心概念:
产品 – 用户可购买的任何内容(订阅、消耗型商品、永久授权)
流程 – 向用户展示产品的页面序列,使用无代码的 Flow 与付费墙编辑工具构建。SDK 通过 getFlow 获取流程。如果您更倾向于用自己的代码构建 UI,请改用付费墙——参见手动实现付费墙 。
版位 – 在应用中展示流程的位置和时机(如 main、onboarding、settings)。您在看板中将流程绑定到版位,然后在代码中通过版位 ID 请求流程。这样可以轻松进行 A/B 测试,并向不同用户展示不同的流程。
Adapty 为您提供三种在应用中启用购买的方式。请根据您的应用需求选择其中一种:
实现方式 复杂度 使用场景 Adapty Flow 与付费墙编辑工具 ✅ 简单 你在无代码编辑工具中创建完整的、可直接购买的流程 。Adapty 自动渲染并在后台处理所有复杂的购买流程、收据验证和订阅管理。 手动创建付费墙 🟡 中等 你在应用代码中自行实现付费墙 UI,但仍从 Adapty 获取流程对象,以保持产品提供的灵活性。参见指南 。 Observer 模式 🔴 复杂 你已有自己的购买处理基础设施并希望继续使用。请注意,Observer 模式在 Adapty 中存在一定限制。参见文章 。
Important
以下步骤介绍如何在应用中接入通过 Adapty 流程与付费墙编辑工具创建的流程。
如果你希望自行构建付费墙界面,请参阅手动实现付费墙 。
要在应用中展示通过 Adapty 流程与付费墙编辑工具创建的流程,你只需在应用代码中完成以下操作:
获取流程 :从 Adapty 获取流程。
展示流程,Adapty 会自动处理购买 :在应用中显示视图。
处理按钮操作 :将用户交互与应用的响应关联起来。例如,当用户点击按钮时打开链接或关闭流程。
开始之前
在开始之前,请先完成以下步骤:
在 Adapty 看板中将您的应用连接到 Google Play 。
在 Adapty 中创建您的产品 。
创建一个流程 并向其中添加产品 。
创建一个版位并将您的流程添加到其中 。
在您的应用代码中安装并激活 Adapty SDK 。本指南使用 Adapty Android SDK v4 API。
1. 获取流程
你的流程与在看板中配置的版位相关联。版位允许你针对不同的目标受众展示不同的流程,或运行 A/B 测试 。
要获取在 Adapty Flow & Paywall Builder 中创建的流程,你需要:
使用 getFlow 方法通过版位 ID 获取 flow 对象,并检查它是否包含视图配置。
使用 getFlowConfiguration 方法获取视图配置。视图配置包含显示流程所需的 UI 元素和样式。
Important
要获取视图配置,请发布流程 。有未发布编辑内容的流程会显示 Dirty 状态,其版位将继续提供上一个已发布的版本。
Adapty. getFlow ( "YOUR_PLACEMENT_ID" ) { result ->
if (result is AdaptyResult.Success) {
val flow = result. value
if ( ! flow.hasViewConfiguration) {
return @getFlow
}
AdaptyUI. getFlowConfiguration (flow) { configResult ->
if (configResult is AdaptyResult.Success) {
val flowConfiguration = configResult. value
}
}
}
}
Adapty. getFlow ( "YOUR_PLACEMENT_ID" , result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyFlow flow = ((AdaptyResult.Success < AdaptyFlow > ) result). getValue ();
if ( ! flow. hasViewConfiguration ()) {
return ;
}
AdaptyUI. getFlowConfiguration (flow, configResult -> {
if (configResult instanceof AdaptyResult.Success) {
AdaptyUI.FlowConfiguration flowConfiguration =
((AdaptyResult.Success < AdaptyUI.FlowConfiguration > ) configResult). getValue ();
// use loaded configuration
}
});
}
});
2. 展示流程
获取到流程配置后,只需添加几行代码即可展示你的流程。
要在设备屏幕上渲染可视化流程,必须先对其进行配置。调用 AdaptyUI.getFlowView() 方法或直接创建 AdaptyFlowView:
val flowView = AdaptyUI. getFlowView (
activity,
flowConfiguration,
null , // products = null means auto-fetch
eventListener,
) val flowView =
AdaptyFlowView (activity) // or retrieve it from xml
.. .
with (flowView) {
showFlow (
flowConfiguration,
null , // products = null means auto-fetch
eventListener,
)
} AdaptyFlowView flowView = AdaptyUI. getFlowView (
activity,
flowConfiguration,
null , // products = null means auto-fetch
eventListener
); AdaptyFlowView flowView =
new AdaptyFlowView (activity); //add to the view hierarchy if needed, or you receive it from xml
...
flowView. showFlow (flowConfiguration, products, eventListener); < com.adapty.ui.AdaptyFlowView xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
视图成功创建后,你可以将其添加到视图层级中,并在设备屏幕上显示出来。
Tip
有关如何显示 flow 的更多详情,请参阅我们的指南 。
当用户点击流程中的按钮时,Android SDK 会自动处理购买、恢复、关闭流程和打开链接等操作。
不过,其他按钮具有自定义或预定义的 ID,需要在代码中处理相应操作,或者你可能希望覆盖其默认行为。
例如,以下是关闭按钮的默认行为。你不需要在代码中添加它,但如果有需要,可以参考这里的实现方式。
override fun onActionPerformed (action: AdaptyUI .Action, context: Context ) {
when (action) {
AdaptyUI.Action.Close -> (context as ? Activity)?. onBackPressed () // default behavior
}
} @ Override
public void onActionPerformed (@ NonNull AdaptyUI.Action action, @ NonNull Context context) {
if (action instanceof AdaptyUI.Action.Close) {
if (context instanceof Activity) {
((Activity) context). onBackPressed ();
}
}
}
下一步
Tip
有疑问或遇到问题?欢迎访问我们的支持论坛 ,在那里你可以找到常见问题的解答,也可以提出自己的问题。我们的团队和社区随时为你提供帮助!
您的流程已准备好在应用中展示。在 Google Play Store 中测试购买 ,确保您能从流程中完成测试购买。
接下来,您需要检查用户的访问等级 ,确保向正确的用户展示流程或开放付费功能。
完整示例
以下是如何将所有步骤整合到你的应用中的完整示例。
class MainActivity : AppCompatActivity () {
override fun onCreate (savedInstanceState: Bundle ?) {
super . onCreate (savedInstanceState)
Adapty. getFlow ( "YOUR_PLACEMENT_ID" ) { flowResult ->
if (flowResult is AdaptyResult.Success) {
val flow = flowResult. value
if ( ! flow.hasViewConfiguration) {
// Use custom logic
return @getFlow
}
AdaptyUI. getFlowConfiguration (flow) { configResult ->
if (configResult is AdaptyResult.Success) {
val flowConfiguration = configResult. value
val flowView = AdaptyUI. getFlowView (
this ,
flowConfiguration,
null , // products = null means auto-fetch
object : AdaptyFlowDefaultEventListener () {
override fun onActionPerformed (action: AdaptyUI .Action, context: Context ) {
when (action) {
is AdaptyUI.Action.Close -> {
(context as ? Activity)?. onBackPressed ()
}
}
}
}
)
setContentView (flowView)
}
}
}
}
}
}
public class MainActivity extends AppCompatActivity {
@ Override
protected void onCreate (Bundle savedInstanceState ) {
super . onCreate (savedInstanceState);
Adapty. getFlow ( "YOUR_PLACEMENT_ID" , flowResult -> {
if (flowResult instanceof AdaptyResult.Success) {
AdaptyFlow flow = ((AdaptyResult.Success < AdaptyFlow > ) flowResult). getValue ();
if ( ! flow. hasViewConfiguration ()) {
// Use custom logic
return ;
}
AdaptyUI. getFlowConfiguration (flow, configResult -> {
if (configResult instanceof AdaptyResult.Success) {
AdaptyUI.FlowConfiguration flowConfiguration =
((AdaptyResult.Success < AdaptyUI.FlowConfiguration > ) configResult). getValue ();
AdaptyFlowView flowView = AdaptyUI. getFlowView (
this ,
flowConfiguration,
null , // products = null means auto-fetch
new AdaptyFlowDefaultEventListener () {
@ 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 (flowView);
}
});
}
});
}
}