## 一、概述
1． 此文档为Air原生游戏接入
2． 文档对应SDK版本为3.0.4
3． 详细接入步骤请参考Demo

## 二、接入准备

### 2.1、工程导入

将SDK项目中Android目录下assets目录下文件复制到游戏目录assets目录下，将Android目录下res中资源文件复制到游戏目录res中(Demo使用的Intellij Idea开发环境，如果使用FB开发的同学，需要引入相应资源文件和FuncellSDKAir.ane到自己的工程中)

### 2.2、配置AndroidManifest.xml文件
```xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<activity
    android:name="com.funcell.platform.android.game.proxy.FuncellSDKLoginActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
 <activity
    android:name="com.funcell.platform.android.game.proxy.pay.funcell.FunSdkUiActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<meta-data ndroid:name="FUNCELL_CHANNEL_TEST" android:value="@string/FUNCELL_CHANNEL_TEST" />
```

## 三、接入接口(具体请参考Src目录下的Main.as文件)

### 3.1、初始化接口（必接）

```java
-- 初始化
FuncellGameSdkProxy.getInstance().Init();
注册初始化回调方法
FuncellGameSdkProxy.getInstance().addEventListener(FuncellInitEvent.onInitSuccess,onInitSuccess);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellInitEvent.onInitFailure,onInitFailure);

-- 初始化成功回调：
protected  function onInitSuccess(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onInitSuccess");
    trace("Main.as----onInitSuccess......");
}
-- 初始化失败回调：
protected  function onInitFailure(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onInitFailure");
    trace("Main.as----onInitFailure......");
}
```

### 3.2、登录接口（必接）
```java
-- 登录
FuncellGameSdkProxy.getInstance().Login();
注册登录回调方法
FuncellGameSdkProxy.getInstance().addEventListener(FuncellSessionEvent.onLoginSuccess,onLoginSuccess);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellSessionEvent.onLoginCancel,onLoginCancel);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellSessionEvent.onLoginFailed,onLoginFailed);

-- 登录成功回调
protected function onLoginSuccess(event:FuncellSessionEvent):void{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onLoginSuccess");
    var token:String = event.result.mToken;//token信息
    var uid:String = event.result.mUserID;//用户ID
    var userName:String = event.result.mUsername;//用户名
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as token:"+token);
}
 --取消登录回调
protected function onLoginCancel(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onLoginCancel");
}
 --登录失败回调
protected function onLoginFailed(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onLoginFailed");
}

```

### 3.3、登出接口（必接）
```java
-- 帐号退出
FuncellGameSdkProxy.getInstance().Logout();
-- 注册帐号退出回调方法
FuncellGameSdkProxy.getInstance().addEventListener(FuncellSessionEvent.onLogout,onLogout);

-- 帐号退出回调
protected function onLogout(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as onLogout");
}

```

### 3.4、支付接口（必接）

**游戏没有的字段可以设置为 &quot;&quot; 空字符串**
```java
-- 支付
-- 注册支付相关回调方法
FuncellGameSdkProxy.getInstance().addEventListener(FuncellPayEvent.onCancel,onCancel);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellPayEvent.onFail,onFail);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellPayEvent.onClosePayPage,onClosePayPage);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellPayEvent.onSuccess,onSuccess);

var Roleinfo:FuncellRoleInfo = new FuncellRoleInfo();
Roleinfo.mRoleName = "test"; //角色名
Roleinfo.mRoleId = "123"; //角色ID
Roleinfo.mRoleLevel = "2";//角色等级
Roleinfo.mServerName = "天下"; //服务器名
Roleinfo.mServerId = "998";//服务器ID
Roleinfo.mVipLevel = "3";//VIP等级
Roleinfo.mGameGoldBalance = "888"; //角色剩余金币数
Roleinfo.mGameUnionName = "游戏工会" //游戏工会

var PayParams:FuncellPayParams = new FuncellPayParams();
PayParams.mItemAmount = "100" //商品价格，单位：分
PayParams.mItemCount = "10";//钻石数量 ,10个元宝
PayParams.mItemDescription="Description"; //商品描述
PayParams.mItemId="100002";//商品ID
PayParams.mItemName = "10元宝";//商品名
PayParams.mItemType = "元宝";//商品类型
PayParams.mOrderId = "465456456" //游戏接入方订单号
PayParams.mExtrasParams = "ExtrasParams"  //透传参数，支付成功后，返回给客户端的数据
PayParams.mRoleInfo = Roleinfo;
FuncellGameSdkProxy.getInstance().Pay(PayParams);
```

| 字段名 | 说明 | 字段名 | 说明 |
| --- | --- | --- | --- |
| RoleName | 角色名 | RoleId | 角色ID |
|RoleLevel | 角色等级 | ServerName | 服务器名 |
| ServerId | 服务器ID | VipLevel | 角色VIP等级 |
| GameGoldBalance | 剩余金币数 | GameUnionName | 游戏公会 |
| ItemName | 商品名 | ItemId | 商品id |
|  ItemCount | 购买元宝数量 | ItemDescription | 商品描述 |
| ItemAmount | 价格/分 | ExtrasParams | 透传参数 |
| ItemType | 商品类型/元宝、钻石 | OrderId | 游戏订单号 |

```java
--支付成功回调
protected function onSuccess(event:FuncellPayEvent):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay onClosePayPage");
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay sdkOrder:"+event.result.mSdkOrder);
    var cpOrder:String = event.result.mCpOrder;//游戏订单号
    var sdkOrder:String = event.result.mSdkOrder;//平台订单号
    var ext:String = event.result.mExtrasParams;//透传参数
}
--支付失败回调
protected function onFail(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay onFail");
}
--支付取消回调
protected function onCancel(event:Event):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay onCancel");
}
--充值页面关闭回调(此回调针对UC渠道或者是其他使用web充值方式，不知道当前状态的处理)
protected function onClosePayPage(event:FuncellPayEvent):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay onClosePayPage");
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as pay sdkOrder:"+event.result.mSdkOrder);
    var cpOrder:String = event.result.mCpOrder;//游戏订单号
    var sdkOrder:String = event.result.mSdkOrder;//平台订单号
    var ext:String = event.result.mExtrasParams;//透传参数
}

```

### 3.5、数据统计接口（必接）

**创建角色事件 ： 创建角色后调用**

```java
--创建角色事件
var dataType:String = FuncellDataTypes.DataTypes.DATA_CREATE_ROLE;
var info:Object={"usermark":"13212","role_id":"998","serverno":"998","server_name":"天下","role_name":"test"};
FuncellGameSdkProxy.getInstance().setDatas(dataType,JSON.stringify(info));
```

| 字段名 | 说明 | 字段名 | 说明 |
| --- | --- | --- | --- |
| serverno | 服务器ID | usermark | 平台登录成功后返回的用户ID |
|level | 角色等级 | role\_id | 角色ID |
| server\_name | 服务器名 |


**登录事件：登录游戏并选择了服务器后调用**
```java
--登录事件
var dataType:String = FuncellDataTypes.DataTypes.DATA_LOGIN;
var info:Object={"usermark":"13212","serverno":"998"};//usermark为登录成功，返回的用户ID---UserID
FuncellGameSdkProxy.getInstance().setDatas(dataType,JSON.stringify(info));
```

| 字段名 | 说明 | 字段名 | 说明|
| --- | --- | --- | --- |
| usermark | 平台登录成功后返回的用户ID | serverno | 服务器ID |

**角色升级事件：角色升级后调用**
```java
--角色升级事件
var dataType:String = FuncellDataTypes.DataTypes.DATA_ROLE_LEVELUP;
var info:Object={"usermark":"13212","serverno":"998","level":"999","role_id":"123","role_name":"test","server_name":"天下"};
FuncellGameSdkProxy.getInstance().setDatas(dataType,JSON.stringify(info));
```

| 字段名 | 说明 | 字段名 | 说明|
| --- | --- | --- | --- |
| usermark | 平台登录成功后返回的用户ID | serverno | 服务器ID |
| level | 角色等级 | role_id | 角色ID |
| role_name | 角色名 | server_name | 服务器名 |

**角色服务器事件：可在进入游戏主场景时调用**

```java
--服务器与角色事件
var dataType:String = FuncellDataTypes.DataTypes.DATA_SERVER_ROLE_INFO;
var info:Object={"role_id":"123","role_level":999,"role_name":"test","role_gameunion_name":"工会","role_vip_level":"VIP等级","serverno":"998","server_name":"天下"};
FuncellGameSdkProxy.getInstance().setDatas(dataType,JSON.stringify(info));
```

| 字段名 | 说明 | 字段名 | 说明|
| --- | --- | --- | --- |
| usermark | 平台登录成功后返回的用户ID | role_level | 角色等级 |
| role_id | 角色ID | server_name | 服务器名 |
| role_vip_level | VIP等级 | role_gameunion_name | 工会 |


### 3.6、游戏退出接口（必接）

```java
-- 游戏退出
FuncellGameSdkProxy.getInstance().Exit();
//注册游戏退出回调方法
FuncellGameSdkProxy.getInstance().addEventListener(FuncellExitEvent.onChannelExit,onChannelExit);
FuncellGameSdkProxy.getInstance().addEventListener(FuncellExitEvent.onGameExit,onGameExit);

-- 渠道有退出界面回调
protected function onChannelExit(event:FuncellExitEvent):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as exit onChannelExit");
}

-- 渠道无退出界面回调
protected function onGameExit(event:FuncellExitEvent):void
{
    FuncellGameSdkProxy.getInstance().FuncellLog("-------Main.as exit onGameExit");
}
```