OPPO流体云推送指南

准备工作

在开始使用OPPO流体云功能之前,您需要完成以下准备工作:

  1. 已参考Android SDK接入OPPO厂商通道集成完成SDKOPPO厂商通道的接入。

  2. 已参考接入准备明确需求信息,并联系OPPO进行确认。

  3. 已参考获取client_idclient_secret获取client_idclient_secret,并参考配置厂商通道密钥EMAS控制台上配置流体云ClientId与流体云ClientSecret。

快速开始

完成准备工作后,您可以通过下面的步骤在测试环境快速创建一个流体云:

  1. 参考环境搭建,在客户端搭建测试环境。

  2. 调用Push - 高级推送接口,参数示例如下:

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0代表正式环境,1代表测试环境

// 设置远程创建流体云的参数
String startIntelligentIntent = """
{
    "intentName": "Example.Progress",
    "identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
    "timestamp": 1729485000989,
    "serviceId": {
        "launcher": "999800001",
        "fluidCloud": "999900001"
    },
    "intentAction": {
        "actionStatus": 0
    },
    "intentEntity": {
        "entityName": "TAXI",
        "entityId": "A580202509130712",
        "milestone": {
            "code": 30,
            "text": "vehicle_coming"
        },
        "capsule": {
            "leftImg": "https://xxxx",
            "rightText": "接驾中",
            "legacyImg": "https://xxxx",
            "legacyText": "接驾中"
        },
        "primary": {
            "title": [
                { 
                    "text": "司机正在赶来",
                    "color": "#00FF00",
                    "darkColor": "#00FF00"
                }
            ],
            "content": "粤BDG4251 灰 广汽埃安",
            "rightImg": "https://xxxx",
            "clickAction": "xxxx",
            "miniImg": "xxxx"
        },
        "secondaryData": {
            "type": "PROGRESS",
            "progress": 20,
            "indicatorImg": "https://xxxx",
            "style": "inside",
            "nodeLabels": ["接单", "上车点", "目的地"]
        }
    }
}
""";
pushRequest.setAndroidOppoIntelligentIntent(startIntelligentIntent);

// 发送推送
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n", 
    pushResponse.getRequestId(), pushResponse.getMessageId());

客户端显示如下:

screenshot_20251117_192953screenshot_20251117_193107

核心概念

OPPO流体云是信息的轻量形态,聚焦精炼,并能在不同设备之间自由流动,把系统中的多种交互形式进行了整合和归一,再统一分发,在适当的场景智能显示,让用户能够更直观地接收到这些信息。

image

流体云支持的场景类型

场景类型

entityName取值

打车服务

TAXI

外卖配送

DELIVERY

到店取餐

PICKUP

赛事比分

MATCH

驾车导航

NAVIGATION

任务

TASK

流体云样式模板

流体云目前共有5种样式模板,分别为进度可视化模板、赛事模板、强调信息模板、大图形模板与对称模板。

image

客户端本地创建/更新/结束流体云

应用进程活跃时,可以参考意图共享(端侧)使用ContentProviderClient在客户端本地操作流体云,参数结构请参考意图共享数据结构。其中actionStatus参数设置为0/1/2时分别对应流体云的创建/更新/结束操作。

通过移动推送接口远程创建/更新/结束流体云

移动推送支持通过Push接口或MassPush接口远程创建/更新/结束流体云。

参数设置

调用接口时注意以下关键参数:

  • PushType: 推送流体云时固定设置为 NOTICE

  • AndroidTargetUserTypeAndroidOppoIntentEnv: 测试环境设置为 1,正式环境设置为0

  • AndroidOppoIntelligentIntent: 流体云意图共享数据结构IntelligentIntentJSON字符串,其中actionStatus在创建/更新/结束时分别设置为0/1/2

  • AndroidOppoDeleteIntentData: 流体云意图删除数据结构dataJSON字符串,通常用于异常状态处理时强制结束流体云。当AndroidOppoIntelligentIntent参数已填写时此参数无效。

AndroidOppoIntelligentIntent的结构如下表所示:

参数

是否必选

参数类型

描述

intentName

String

意图名称

identifier

String

本次意图共享的唯一id,可用UUID生成,开发者按照自身业务需要生成,作为单条共享记录的唯一标识符

timestamp

Long

意图共享发生的系统时间戳,单位为毫秒

serviceId

JSON

卡片ID,每个serviceId对应一张卡片,每个入口对应一个serviceId

intentAction

JSON

用于描述意图的动作

actionStatus

Int

流体云操作类型:

  1. 创建流体云

  2. 更新流体云

  3. 结束流体云

intentEntity

JSON

意图共享实体信息,用于描述意图的垂域实体内容

entityName

String

垂域名称

entityId

String

实体ID,用于描述实体的唯一标识符,业务可传订单号之类的标识

milestone

JSON

里程碑状态,详见垂域里程碑

capsule

JSON

胶囊信息

primary

JSON

卡片主要信息

secondaryData

JSON

卡片扩展信息

extra

JSON

业务扩展数据

isSensitive

Boolean

是否包含敏感数据,如金额、地理位置等,不传默认不包含

...

-

其他业务字段,需同步OPPO

说明

各样式模板的AndroidOppoIntelligentIntent参数的详细说明请参考文档:

AndroidOppoDeleteIntentData的结构如下表所示:

参数

是否必选

参数类型

描述

intentName

String

意图名称

entityIds

List<String>

实体id列表

serviceId

JSON

服务列表

示例代码

远程创建流体云

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0代表正式环境,1代表测试环境

// 设置远程创建流体云的参数
String startIntelligentIntent = """
{
    "intentName": "Example.Progress",
    "identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
    "timestamp": 1729485000989,
    "serviceId": {
        "launcher": "999800001",
        "fluidCloud": "999900001"
    },
    "intentAction": {
        "actionStatus": 0
    },
    "intentEntity": {
        "entityName": "TAXI",
        "entityId": "A580202509130712",
        "milestone": {
            "code": 30,
            "text": "vehicle_coming"
        },
        "capsule": {
            "leftImg": "https://xxxx",
            "rightText": "接驾中",
            "legacyImg": "https://xxxx",
            "legacyText": "接驾中"
        },
        "primary": {
            "title": [
                { 
                    "text": "司机正在赶来",
                    "color": "#00FF00",
                    "darkColor": "#00FF00"
                }
            ],
            "content": "粤BDG4251 灰 广汽埃安",
            "rightImg": "https://xxxx",
            "clickAction": "xxxx",
            "miniImg": "xxxx"
        },
        "secondaryData": {
            "type": "PROGRESS",
            "progress": 20,
            "indicatorImg": "https://xxxx",
            "style": "inside",
            "nodeLabels": ["接单", "上车点", "目的地"]
        }
    }
}
""";
pushRequest.setAndroidOppoIntelligentIntent(startIntelligentIntent);

// 发送推送
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n", 
    pushResponse.getRequestId(), pushResponse.getMessageId());

远程更新流体云

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0代表正式环境,1代表测试环境

// 设置远程创建流体云的参数
String updateIntelligentIntent = """
{
    "intentName": "Example.Progress",
    "identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
    "timestamp": 1729485000989,
    "serviceId": {
        "launcher": "999800001",
        "fluidCloud": "999900001"
    },
    "intentAction": {
        "actionStatus": 1
    },
    "intentEntity": {
        "entityName": "TAXI",
        "entityId": "A580202509130712",
        "milestone": {
            "code": 30,
            "text": "vehicle_coming"
        },
        "capsule": {
            "leftImg": "https://xxxx",
            "rightText": "上车中",
            "legacyImg": "https://xxxx",
            "legacyText": "上车中"
        },
        "primary": {
            "title": [
                { 
                    "text": "司机到达上车点",
                    "color": "#00FF00",
                    "darkColor": "#00FF00"
                }
            ],
            "content": "粤BDG4251 灰 广汽埃安",
            "rightImg": "https://xxxx",
            "clickAction": "xxxx",
            "miniImg": "xxxx"
        },
        "secondaryData": {
            "type": "PROGRESS",
            "progress": 50,
            "indicatorImg": "https://xxxx",
            "style": "inside",
            "nodeLabels": ["接单", "上车点", "目的地"]
        }
    }
}
""";
pushRequest.setAndroidOppoIntelligentIntent(updateIntelligentIntent);

// 发送推送
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n", 
    pushResponse.getRequestId(), pushResponse.getMessageId());

远程结束流体云

方式一:通过AndroidOppoIntelligentIntent参数结束流体云

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0代表正式环境,1代表测试环境

// 设置远程创建流体云的参数
String stopIntelligentIntent = """
{
    "intentName": "Example.Progress",
    "identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
    "timestamp": 1729485000989,
    "serviceId": {
        "launcher": "999800001",
        "fluidCloud": "999900001"
    },
    "intentAction": {
        "actionStatus": 2
    },
    "intentEntity": {
        "entityName": "TAXI",
        "entityId": "A580202509130712",
        "milestone": {
            "code": 30,
            "text": "vehicle_coming"
        },
        "capsule": {
            "leftImg": "https://xxxx",
            "rightText": "上车中",
            "legacyImg": "https://xxxx",
            "legacyText": "上车中"
        },
        "primary": {
            "title": [
                { 
                    "text": "司机到达上车点",
                    "color": "#00FF00",
                    "darkColor": "#00FF00"
                }
            ],
            "content": "粤BDG4251 灰 广汽埃安",
            "rightImg": "https://xxxx",
            "clickAction": "xxxx",
            "miniImg": "xxxx"
        },
        "secondaryData": {
            "type": "PROGRESS",
            "progress": 50,
            "indicatorImg": "https://xxxx",
            "style": "inside",
            "nodeLabels": ["接单", "上车点", "目的地"]
        }
    }
}
""";
pushRequest.setAndroidOppoIntelligentIntent(stopIntelligentIntent);

// 发送推送
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n", 
    pushResponse.getRequestId(), pushResponse.getMessageId());

方式二:通过AndroidOppoDeleteIntentData参数结束流体云

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0代表正式环境,1代表测试环境

// 设置远程创建流体云的参数
String stopData = """
{
    "intentName": "Example.Progress",
    "entityIds": [
        "A580202509130712"
    ],
    "serviceId": {
        "launcher": "999800001",
        "fluidCloud": "999900001"
    }
}
""";
pushRequest.setAndroidOppoDeleteIntentData(stopData);

// 发送推送
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n", 
    pushResponse.getRequestId(), pushResponse.getMessageId());

流体云限制

  • 流体云支持ColorOS15及以上的OPPO手机,测试环境需要参考环境搭建在客户端搭建。

  • 不同的entityName具有不同的销卡延时,即场景退出时间,同一个订单超过该时间没有收到新的数据推送,则会销卡,流体云卡片所有入口和小布建议卡片都会消失;流体云胶囊受系统限制,在OS15最长只能显示5分钟(不同OS系统有差异),不受销卡延时控制。详情请参考垂域里程碑

问题排查

创建流体云失败

  1. 检查设备机型是否为ColorOS15及以上。

  2. 参考查询开关检查系统的意图共享特性开关是否打开。

  3. 检查是否已按照环境搭建在客户端搭建测试环境。

  4. 根据消息ID与设备ID在移动推送控制台的排查工具->排查消息页面检查流体云推送链路。

更新/结束流体云失败

  1. 检查AndroidOppoIntelligentIntent参数或AndroidOppoDeleteIntentData中的entityId是否与创建流体云时的entityId相同。

  2. 根据消息ID与设备ID在移动推送控制台的排查工具->排查消息页面检查流体云推送链路。