客户端接入引导-Android

客户端接入引导-Android

1

准备:
将Demo项目libs目录下的ixsdk_pay.pro.jar包复制到游戏项目的libs目录下。
Demo示例工程需要在android SDK 16(含)以上进行调试。

注意:
1. 所有接口参数不能为 null。
2. 所有接口都需要在UI主线程中调用。
3. 应用信息,渠道参数,支付回调地址等信息,在stars-cloud.com开发者后台填写。

2

配置Android Manifest【必接】 查看

2.1 添加IXSDK_APPID

需要把您在 stars-cloud.com 平台申请的 IXSDK_APPID 写入 Android Manifest.xml中的 application 标签下。

<application >

    <meta-data
        android:name="IXSDK_APPID"
        android:value="您在ixsdk.com平台申请的AppId" />

</application>

2.2 添加用户权限

此处添加的权限只是SDK测试时使用的权限,在游戏打包时,会再根据渠道的需要增加不同的权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

3

代码混淆 查看

如果要混淆 java 代码,请不要混淆联编的 jar 包中的类。可以添加以下类到 proguard 配置,排除在混淆之外:

-keep class com.ixsdk.** {*;}

4

Activity生命周期方法【必接】 查看

需要在游戏主Activity的生命周期方法中调用对应的IXSDK要求接入的周期方法。
这些方法是星云平台全部渠道总结出来的,建议全部接入,避免因为某些渠道的特殊需求而出现问题,耽误上线。

注意: 要保证对 IXProxy.EXT_ON_CREATE 的调用在所有其他生命周期方法调用之前。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_CREATE, null);
}

@Override
protected void onStart() {
    super.onStart();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_START, null);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_NEW_INTENT, intent);
}

@Override
protected void onRestart() {
    super.onRestart();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_RESTART, null);
}

@Override
protected void onResume() {
    super.onResume();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_RESUME, null);
}

@Override
protected void onPause() {
    super.onPause();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_PAUSE, null);
}

@Override
protected void onStop() {
    super.onStop();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_STOP, null);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_DESTROY, null);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_WINDOW_FOCUS_CHANGED,
            new Intent().putExtra(IXProxy.EXT_HAS_FOCUS, hasFocus));
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_CONFIGURATION_CHANGED, null);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(null == data) {
        data = new Intent();
    }
    data.putExtra(IXProxy.EXT_REQUEST_CODE, requestCode);
    data.putExtra(IXProxy.EXT_RESULT_CODE, resultCode);
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_ACTIVITY_RESULT, data);
}

@Override
public void onBackPressed() {
    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_ON_BACK_PRESSED, null);
}

5

退出【必接】 查看

游戏需要在用户选择退出时,调用exit()方法,接入该接口后,会在游戏退出时,展示渠道要求显示的退出界面,并根据用户的操作回调不同的方法。

public void exit(Activity, IXExitListener);

退出回调如下:
回调参数showGameExitUI的值会根据各渠道是否提供退出界面来自动设置。
当参数showGameExitUI为false时,表示已经展示了渠道提供的退出界面,并且用户已经确认要退出游戏,此时游戏无需再次展示自己的退出确认界面,只要执行退出逻辑即可。
当参数showGameExitUI为true时,表示渠道没有提供退出界面,需要游戏展示自己的退出确认界面,并根据用户的操作决定是否执行游戏退出逻辑:

new IXExitListener() {
    @Override
    public void onExit(Activity activity, boolean showGameExitUI) {
        if(showGameExitUI) {
            // TODO 展示游戏退出UI,需要游戏自行实现退出逻辑
            showToast("展示游戏自定义退出UI", Toast.LENGTH_SHORT);
        } else {
            // TODO 需要游戏自行实现退出逻辑
            showToast("执行游戏自定义退出逻辑", Toast.LENGTH_SHORT);

            // 设置玩家退出数据
            setPlayerExtData(IXProxy.EXT_PLAYER_EXIT_GAME);

            // 游戏退出前,必须执行如下SDK销毁代码
            IXProxy.getInstance().destroy(DemoMainActivity.this);
            finish();
        }
    }
}

6

销毁【必接】 查看

在exit()的onExit()回调方法中调用此方法,执行渠道的资源释放等操作。
此方法需要在游戏执行finish或kill process之前调用。

IXProxy.getInstance().destroy(Activity);

7

登录相关【联网游戏必接】 查看

7.1 用户信息

IXUser定义了用户登录后渠道返回的相关信息,数据结构说明如下:
其中channelUserId可以和游戏中的用户Id进行绑定,保证一一对应。

public class IXUser {
    getPayChannel();   // 渠道标识
    getChannelUserId();    // 渠道用户ID
    getChannelUserName();  // 渠道用户名,可能为null或者“”
    getIXToken(); // 星云Token, 每次登录都会不同
    getIXTime();  // 时间戳
    getIXSign();  // 登录签名,具体算法参考“服务端接入-登录验签“部分    
}

7.2 设置用户其他游戏信息

开发者在玩家角色创建,升级,登录,退出四个地方调用此接口,并根据实际情况填写如下信息,以免影响上线和支付。

/**
 * 设置玩家创建角色,角色升级,角色登录数据,
 * IXProxy.EXT_PLAYER_CREATE_ROLE  // 创建
 * IXProxy.EXT_PLAYER_LEVEL_UP     // 升级
 * IXProxy.EXT_PLAYER_LOGIN_GAME   // 登录
 * IXProxy.EXT_PLAYER_EXIT_GAME    // 退出
 * 必须接入此接口,而且角色创建时间在任何数据接口必须是同一个服务器时间(秒为单位)
 */
private void setPlayerExtData() {
    Bundle mPlayerData = new Bundle();
    // 玩家在游戏中的角色id
    mPlayerData.putString(IXProxy.EXT_PLAYER_ROLE_ID, "4391763487");
    // 玩家角色名称
    mPlayerData.putString(IXProxy.EXT_PLAYER_ROLE_NAME, "韦小宝");
    // 玩家角色等级,整数
    mPlayerData.putInt(IXProxy.EXT_PLAYER_ROLE_LEVEL, 1);
    // 玩家创建时间,长整型,必须服务器时间(秒为单位)
    mPlayerData.putLong(IXProxy.EXT_PLAYER_ROLE_CREATE_TIME, 14232323);
    // 玩家等级变化时间,长整型,必须服务器时间(秒为单位)
    mPlayerData.putLong(IXProxy.EXT_PLAYER_ROLE_LEVEL_UP_TIME, 14232323);
    // 玩家在游戏内虚拟币余额 整数
    mPlayerData.putInt(IXProxy.EXT_PLAYER_BALANCE, 25);
    // 角色vip等级 如无VIP等级 数据为0
    mPlayerData.putInt(IXProxy.EXT_PLAYER_VIP_LEVEL, 2);
    // 服务器名Id,整数
    mPlayerData.putInt(IXProxy.EXT_PLAYER_SERVER_ID, 1);
    // 服务器名名称
    mPlayerData.putString(IXProxy.EXT_PLAYER_SERVER_NAME, "紫禁城");
    // 角色所在公会 如无工会 数据为 "无"
    mPlayerData.putString(IXProxy.EXT_PLAYER_PARTY_NAME, "天地会");

    IXProxy.getInstance().extFunc(this, null, IXProxy.EXT_PLAYER_LOGIN_GAME,
            new Intent().putExtras(mPlayerData));
}

7.3 用户登录,登出行为回调接口

此接口需要在调用登录接口之前调用,以保证能在玩家登录完成后有相应的回调。

IXProxy.getInstance().setUserActionListener(new IXUserActionListener() {
    @Override
    public void onLoginSuccess(IXUser user) {
        if(user != null) {
            // 处理登录成功的逻辑
            // TODO 第一步,清除上一个玩家游戏数据,游戏需要回到登录页面

            // TODO 第二步,在此实现游戏玩家的登录成功逻辑

            // TODO 第三步,设置玩家登录后的游戏详细信息接口
            setPlayerExtData(IXProxy.EXT_PLAYER_LOGIN_GAME);
        } else {
            // 处理登录失败的逻辑
        } 
    }

    @Override
    public void onLoginFail(String reason) {
        // 处理登录失败的逻辑
    }

    @Override
    public void onLogout() {
        // TODO 清除老数据,游戏需要回到登录页面
        // TODO 可以在此处执行登录接口来实现账号切换
    }
});

7.4 登录

// activity为当前的Activity
IXProxy.getInstance().login(Activity);

7.5 登出

可以在游戏结束前调用此登出接口,完成用户信息销毁的动作。

/**
* 登出
* @param activity
*/
IXProxy.getInstance().logout(Activity)

8

支付【必接】 查看

用户发起支付,支付成功后的支付金额,订单等参数会通知给游戏服务器。
客户端支付回调接口:

new IXPayListener() {
    @Override
    public void onSuccess(IXPayResult result) {
        // 请在此处处理支付成功后的逻辑
        Log.i(TAG, "pay success : " + result);
    }
    
    @Override
    public void onFail(String result) {
        // 请在此处处理支付失败后的逻辑
        Log.i(TAG, "pay fail : " + result);
    }
    
    @Override
    public void onPending(IXPayResult result) {
        // 支付进行中,支付无法在指定的时间内完成,需要游戏服务端去ixsdk.com的后台服务端轮询当前支付结果	
    }
}

在客户端回调支付成功之后,游戏必须去游戏服务端确认当前订单状态,最终支付结果应该以服务端回调结果为准。。
开发者可以根据实际的需求来调用以下支付接口:
pay():用来购买游戏中的道具,如:钻石,金币等。

/**
 * 游戏商品(道具)支付
 *
 * @param activity  上下文Activity
 
 * @param goodsId  游戏商品id
 * @param goodsName  游戏币名称
 * @param goodsCount  游戏币数量
 * @param totalPrice  游戏商品价格,单位为人民币分
 * @param extraInfo
 *            由游戏开发者定义传入的字符串,回与支付结果一同发送给游戏服务器,
 *            游戏服务器可通过该字段判断交易的详细内容(金额 角色等)
 * @param extraIntent  
 *            如果是使用短代支付,需要在extraIntent中设置 IXProxy.EXT_SMS_PAY 为 true
 *            extraIntent = new Intent().putExtra(IXProxy.EXT_SMS_PAY, true);
 *            同时,goodsId 需要传入运营商分配的计费点
 * @param listener  支付回调接口
 */
public void pay(Activity activity,
            String goodsId, String goodsName, int goodsCount, int totalPrice,
            String extraInfo,
            Intent extraIntent,
            IXPayListener callback);

9

其他接口【选接】 查看

9.1 获取渠道标识接口

获取当前渠道标识,如qihoo,xiami 等

IXProxy.getInstance().getChannelType(Activity);

各个渠道标识对应表请访问: 星云渠道列表

9.2 获取运营商标识接口

获取当前手机SIM卡运营商的标识 :

/**
 * 运营商标识
 */
IXProxy.OPERATOR_MOBILE   // 移动
IXProxy.OPERATOR_UNICOM   // 联通
IXProxy.OPERATOR_TELECOM   // 电信
IXProxy.OPERATOR_UNKNOWN  // 无法识别

/**
 * 获取当前运营商代码
 *
 * @param context
 * @return 0:移动,1:联通,2:电信,-1:未知
 */
IXProxy.getInstance().getOperatorCode(Application);