在 Android SDK 中使用 Flow Builder 启用购买功能 要启用应用内购买,你需要了解三个核心概念:
产品 – 用户可购买的任何内容(订阅、消耗型商品、永久授权)
流程 – 向用户展示产品的屏幕序列,使用无代码的 Flow Builder 构建,SDK 通过 getFlow 获取。如果你更倾向于用自己的代码构建 UI,请改用付费墙——参见手动实现付费墙 。
版位 – 在应用中展示流程的位置和时机(如 main、onboarding、settings)。你在看板中将流程绑定到版位,然后在代码中通过版位 ID 请求对应流程。这样可以轻松进行 A/B 测试,并向不同用户展示不同的流程。
Adapty 为您提供三种在应用中启用购买的方式。请根据您的应用需求选择其中一种:
| 实现方式 | 复杂度 | 适用场景 |
|---|---|---|
| Adapty Flow Builder | ✅ 简单 | 您在无代码编辑工具中创建完整的、可直接购买的流程 。Adapty 自动渲染并在后台处理所有复杂的购买流程、收据验证和订阅管理。 |
| 手动创建付费墙 | 🟡 中等 | 您在应用代码中实现付费墙 UI,但仍从 Adapty 获取流程对象,以保持产品offerings的灵活性。请参阅指南 。 |
| 观察者模式 | 🔴 复杂 | 您已有自己的购买处理基础设施,并希望继续使用。请注意,观察者模式在 Adapty 中存在一定限制。请参阅文章 。 |
以下步骤介绍如何实现在 Adapty Flow Builder 中创建的流程。
如果你更倾向于自行构建付费墙 UI,请参阅手动实现付费墙 。
要在应用中显示在 Adapty Flow Builder 中创建的流程,你只需在代码中完成以下步骤:
获取流程 :从 Adapty 获取流程。
显示流程,Adapty 将自动处理购买 :在应用中展示视图。
处理按钮操作 :将用户交互与应用的响应逻辑关联起来,例如在用户点击按钮时打开链接或关闭流程。
开始之前
开始之前,请完成以下步骤:
在 Adapty 看板中将你的应用连接到 Google Play 。
在 Adapty 中创建产品 。
创建流程并添加产品 。
创建版位并将流程添加到其中 。
在应用代码中安装并激活 Adapty SDK 。本指南使用 Adapty Android SDK v4(测试版)API。
1. 获取流程
你的流程与在看板中配置的版位相关联。通过版位,你可以针对不同的目标受众运行不同的流程,或进行 A/B 测试 。
要获取在 Adapty 流程编辑器中创建的流程,需要:
使用 getFlow 方法,通过版位 ID 获取 flow 对象,并检查它是否包含视图配置。
使用 getFlowConfiguration 方法获取视图配置。视图配置包含显示流程所需的 UI 元素和样式信息。
要获取视图配置,必须在 Flow Builder 中开启 Show on device 开关。否则将获得空的视图配置,流程将无法显示。
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" />
视图成功创建后,你可以将其添加到视图层级中,并在设备屏幕上显示出来。
有关如何显示 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 ();
}
}
}
下一步
有疑问或遇到问题?请访问我们的支持论坛 ,您可以在那里找到常见问题的解答,或者提出您自己的问题。我们的团队和社区随时为您提供帮助!
您的流程已准备好在应用中展示。在 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);
}
});
}
});
}
}