游戏sdk接入教程:360渠道SDK接入

2018-06-20 15:05 更新

官方文档及SDK的下载地址为:http://dev.360.cn/wiki/index/id/73

在接入之前,需先在360后台创建游戏,获取一些接入参数。

客户端所需要参数包括:APPID、APPKEY、PRIVATEKEY 三个值填写在 AndroidManifest 文件中,不能使用@string 引用;禁止把 AppSecret 保存在手机客户端,AndroidManifest 中存放的是 Private Key,而非 App-Secret。

Private Key 的算法为:QHOPENSDK_PRIVATEKEY = MD5(appSecret + "#" + appKey),格式为 32 位小写。

准备工作做为,正式开始接入,首先肯定是把所需要的资源如JAR包之类的复制到我的工程中去。

我这边的接入环境是Eclipse

打开我们下载好解压出来的文档目录找到所需要依赖的JAR包

01

红框所示就是我们Eclipse所需要的资源文件了。

把assets内的文件复制到我们自己工程中的assets目录内。

把libs内的文件复制到我们自己工程中的libs目录内。

下图中红框内的文件夹按自己所需要复制

02

至于demo工程如何创建在上一篇的接入文档中有详细教程,请至:

http://www.cnblogs.com/laohaizei/p/6724250.html

03

复制完成之后,我们的demo目录应该是多了这些目录

至此,我们已经把所有需要的东西都复制到了我们的demo工程中。

首先我们打开我们工程的AndroidManifest.xml文件。

04

然后复制以下代码

<?xml version="1.0" encoding="utf-8"?>


    

    

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    
    
    
    
    
    
    
    
    
    
    
    

    
    
    
    
    
    
    
    
    
    
    

    
    

    
    
    
    
    
    
    
    
    
    


    
    

    

    
        
            
                

                
            
        
        
        

            
            
                
                

                
                
                
                
                
                
            
        

        
        
        
        

        
        
        
        


        
        
        
        
        
        

        
        
            
                

                
            
        

        

        
        
        
        
        
        

        
        
            
                
            
            
                
            
        

        
        

        
            
                
            
        
        
            
                
            
        
        


        
        
        

        
        
        
        
        


        
        

        
        


        
        
        


        
        
    

以上是需要添加在AndroidManifest.xml中的。(@xxx@部分请注意替换修改,具体有:@app_key@、@private_key@、@app_id@、@wx_app_id@)

然后到我们demo工程的AndroidManifest.xml全选替换粘贴

这样AndroidManifest.xml修改好了。

做完以上步骤,接下来,我们开始接入SDK的接口。

首先打开我们的MainActivity.java

打开的MainActivity.java应该是这个样子的

05

然后把下面的代码复制进去,注意别把第一行的代码覆盖了。

import java.util.HashMap;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;

import com.qihoo.gamecenter.sdk.activity.ContainerActivity;
import com.qihoo.gamecenter.sdk.common.IDispatcherCallback;
import com.qihoo.gamecenter.sdk.matrix.Matrix;
import com.qihoo.gamecenter.sdk.protocols.CPCallBackMgr.MatrixCallBack;
import com.qihoo.gamecenter.sdk.protocols.ProtocolConfigs;
import com.qihoo.gamecenter.sdk.protocols.ProtocolKeys;

public class MainActivity extends Activity {

    final static String TAG = "demo";
    boolean isInit = false;
    Activity appActivity = MainActivity.this;
    Context appContext = this;
    public boolean isLoginFinished = false;
    public boolean isInitFinished = false;
    private boolean mIsInOffline = false;
    private boolean isLandScape = true;
    private boolean isShowClose = false; // 是否显示关闭按钮
    private boolean isSupportOffline = false; // 可选参数,是否支持离线模式,默认值为false
    private boolean isShowSwitchButton = true; // 可选参数,是否在自动登录的过程中显示切换账号按钮
    private boolean isHideWellcome = false; // 可选参数,是否隐藏欢迎界面
    private boolean isShowDlgOnFailedAutoLogin = true; // 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示
    private boolean isAutoLoginHideUI = false; // 可选参数,自动登录过程中是否不展示任何UI,默认展示。
    private boolean isDebugSocialShare = true; // 测试参数,发布时要去掉
    protected String mAccessToken = null;
//    private ProgressDialog mProgress;
    // AccessToken是否有效
    protected static boolean isAccessTokenValid = true;
    // QT是否有效
    protected static boolean isQTValid = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Matrix.onPause(appActivity);
    }

    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
        Matrix.onRestart(appActivity);
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        Matrix.onResume(appActivity);
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Matrix.onStart(appActivity);
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Matrix.onStop(appActivity);
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Matrix.destroy(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        Matrix.onActivityResult(appActivity, requestCode, resultCode, data);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        // TODO Auto-generated method stub
        super.onNewIntent(intent);
        Matrix.onNewIntent(appActivity, intent);
    }

    private void init() {
        // TODO Auto-generated method stub
        MatrixCallBack mSDKCallback = new MatrixCallBack() {

            @Override
            public void execute(Context context, int functionCode,
                    String functionParams) {
                // TODO Auto-generated method stub
                if (functionCode == ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT) {
                    // 调用 sdk 的切换帐号接口
                    doSdkSwitchAccount(getLandscape(context));
                } else if (functionCode == ProtocolConfigs.FUNC_CODE_INITSUCCESS) {
                    // 这里返回成功之后才能调用 SDK 其它接口 TypeSDKLogger.d(
                    // "initSDK success");
                    isInit = true;
                }
            }
        };
        // 调用其他SDK接口之前必须先调用init
        Matrix.init(appActivity, mSDKCallback);
    }

    protected boolean getLandscape(Context context) {
        if (context == null) {
            return false;
        }
        boolean landscape = (context.getResources().getConfiguration().orientation
                == Configuration.ORIENTATION_LANDSCAPE);
        return landscape;
    }

    /
      使用360SDK的切换账号接口

      @param isLandScape
      是否横屏显示登录界面
     /
    protected void doSdkSwitchAccount(boolean isLandScape) {
        Intent intent = getSwitchAccountIntent(isLandScape);
        IDispatcherCallback callback = mAccountSwitchCallback;
        if (isSupportOffline) {
            callback = mAccountSwitchSupportOfflineCB;
        }
        Matrix.invokeActivity(appActivity, intent, callback);
    }

    /
      生成调用360SDK切换账号接口的Intent

      @param isLandScape
      是否横屏
      @param isBgTransparent
      是否背景透明
      @param clientId
      即AppKey
      @return Intent
     /
    private Intent getSwitchAccountIntent(boolean isLandScape) {
        Intent intent = new Intent(appActivity, ContainerActivity.class);

        // 界面相关参数,360SDK界面是否以横屏显示。
        intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
                isLandScape);

        // 必需参数,使用360SDK的切换账号模块。
        intent.putExtra(ProtocolKeys.FUNCTION_CODE,
                ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);

        // 是否显示关闭按钮
        intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);

        // 可选参数,是否支持离线模式,默认值为false
        intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);

        // 可选参数,是否在自动登录的过程中显示切换账号按钮
        intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
                isShowSwitchButton);

        // 可选参数,是否隐藏欢迎界面
        intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);

        // 可选参数,登录界面的背景图片路径,必须是本地图片路径
        // intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
        // getUiBackgroundPicPath());
        // 可选参数,指定assets中的图片路径,作为背景图
        // intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
        // getUiBackgroundPathInAssets());

        // -- 以下参数仅仅针对自动登录过程的控制
        // 可选参数,自动登录过程中是否不展示任何UI,默认展示。
        intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);

        // 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示
        intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
                isShowDlgOnFailedAutoLogin);
        // 测试参数,发布时要去掉
        intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);

        return intent;
    }

    // 切换账号的回调
        private IDispatcherCallback mAccountSwitchCallback = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                // press back
                if (isCancelLogin(data)) {
                    return;
                }

                // 显示一下登录结果
                // Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();

                // TypeSDKLogger.d( "mAccountSwitchCallback, data is " + data);
                // 解析User info
//                QihooUserInfo info = parseUserInfoFromLoginResult(data);
                // 解析access_token
                mAccessToken = parseAccessTokenFromLoginResult(data);
            }
        };

        // 支持离线模式的切换账号的回调
        private IDispatcherCallback mAccountSwitchSupportOfflineCB = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                // press back
                if (isCancelLogin(data)) {
                    return;
                }
                // 显示一下登录结果
                // Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
                // TypeSDKLogger.d( "mAccountSwitchSupportOfflineCB, data is " + data);
                // 解析User info
                // 解析access_token
                mAccessToken = parseAccessTokenFromLoginResult(data);
            }
        };

    private void login() {
        mIsInOffline = false;
        Intent intent = getLoginIntent(isLandScape);
        IDispatcherCallback callback = mLoginCallback;
        if (isSupportOffline) {
            callback = mLoginCallbackSupportOffline;
        }
        Matrix.execute(appActivity, intent, callback);
    }

    /
      生成调用360SDK登录接口的Intent

      @param isLandScape
      是否横屏
      @return intent
     /
    private Intent getLoginIntent(boolean isLandScape) {

        Intent intent = new Intent(appActivity, ContainerActivity.class);

        // 界面相关参数,360SDK界面是否以横屏显示。
        intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
                isLandScape);

        // 必需参数,使用360SDK的登录模块。
        intent.putExtra(ProtocolKeys.FUNCTION_CODE,
                ProtocolConfigs.FUNC_CODE_LOGIN);

        // 是否显示关闭按钮
        intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);

        // 可选参数,是否支持离线模式,默认值为false
        intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);

        // 可选参数,是否在自动登录的过程中显示切换账号按钮
        intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
                isShowSwitchButton);

        // 可选参数,是否隐藏欢迎界面
        intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);

        // 可选参数,登录界面的背景图片路径,必须是本地图片路径
        // intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
        // getUiBackgroundPicPath());
        // 可选参数,指定assets中的图片路径,作为背景图
        // intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
        // getUiBackgroundPathInAssets());

        // -- 以下参数仅仅针对自动登录过程的控制
        // 可选参数,自动登录过程中是否不展示任何UI,默认展示。
        intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);

        // 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示
        intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
                isShowDlgOnFailedAutoLogin);
        // 测试参数,发布时要去掉
        intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);

        return intent;
    }

    // 登录、注册的回调
        private IDispatcherCallback mLoginCallback = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                // press back
                if (isCancelLogin(data)) {
//                    doSdkLogin(true);
                    return;
                }

                // 显示一下登录结果
                Log.d(TAG, "login callback data:" + data);
                mIsInOffline = false;
                // 解析access_token
                mAccessToken = parseAccessTokenFromLoginResult(data);
            }
        };

        private IDispatcherCallback mLoginCallbackSupportOffline = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                if (isCancelLogin(data)) {
                    return;
                }

                Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data);
                try {
                    JSONObject joRes = new JSONObject(data);
                    JSONObject joData = joRes.getJSONObject("data");
                    String mode = joData.optString("mode", "");
                    if (!TextUtils.isEmpty(mode) && mode.equals("offline")) {
                        // Toast.makeText(appActivity,
                        // "login success in offline mode",
                        // Toast.LENGTH_SHORT).show();
                        mIsInOffline = true;
                        // 显示一下登录结果
                        // Toast.makeText(appActivity, data,
                        // Toast.LENGTH_LONG).show();
                        //TypeSDKLogger.e( "token:" + mAccessToken);
                        // 登录结果直接返回的userinfo中没有qid,需要去应用的服务器获取用access_token获取一下带qid的用户信息
                        //getUserInfo(mQihooUserInfo);
                    } else {
                        mLoginCallback.onFinished(data);
                    }
                } catch (Exception e) {
                    Log.e(TAG, "mLoginCallbackSupportOffline exception", e);
                }

            }
        };

    private void pay() {
        String price = "100";

        // 支付基础参数 
        QihooPayInfo payInfo = getQihooPay(
                price,//_in_pay.GetData(AttName.REAL_PRICE)
                "商品名",
                "玩家名",
                "玩家ID",
                "服务器ID",
                "订单号",
                "回调地址",
                "360用户ID");
        Intent intent = getPayIntent(isLandScape, payInfo);

        // 必需参数,使用360SDK的支付模块。
        intent.putExtra(ProtocolKeys.FUNCTION_CODE,
                ProtocolConfigs.FUNC_CODE_PAY);

        // 启动接口
        Matrix.invokeActivity(appActivity, intent, mPayCallback);
    }

    /
      生成调用360SDK支付接口的Intent

      @param isLandScape
      @param pay
      @return Intent
     /
    protected Intent getPayIntent(boolean isLandScape, QihooPayInfo pay) {
        Bundle bundle = new Bundle();

        // 界面相关参数,360SDK界面是否以横屏显示。
        bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
                isLandScape);

        //  以下非界面相关参数 

        // 设置QihooPay中的参数。

        // 必需参数,用户access token,要使用注意过期和刷新问题,最大64字符。
        bundle.putString(ProtocolKeys.ACCESS_TOKEN, pay.getAccessToken());

        // 必需参数,360账号id,整数。
        bundle.putString(ProtocolKeys.QIHOO_USER_ID, pay.getQihooUserId());

        // 必需参数,所购买商品金额, 以分为单位。金额大于等于100分,360SDK运行定额支付流程; 金额数为0,360SDK运行不定额支付流程。
        bundle.putString(ProtocolKeys.AMOUNT, pay.getMoneyAmount());

        // 必需参数,人民币与游戏充值币的默认比例,例如2,代表1元人民币可以兑换2个游戏币,整数。
        bundle.putString(ProtocolKeys.RATE, pay.getExchangeRate());

        // 必需参数,所购买商品名称,应用指定,建议中文,最大10个中文字。
        bundle.putString(ProtocolKeys.PRODUCT_NAME, pay.getProductName());

        // 必需参数,购买商品的商品id,应用指定,最大16字符。
        bundle.putString(ProtocolKeys.PRODUCT_ID, pay.getProductId());

        // 必需参数,应用方提供的支付结果通知uri,最大255字符。360服务器将把支付接口回调给该uri,具体协议请查看文档中,支付结果通知接口–应用服务器提供接口。
        bundle.putString(ProtocolKeys.NOTIFY_URI, pay.getNotifyUri());

        // 必需参数,游戏或应用名称,最大16中文字。
        bundle.putString(ProtocolKeys.APP_NAME, pay.getAppName());

        // 必需参数,应用内的用户名,如游戏角色名。 若应用内绑定360账号和应用账号,则可用360用户名,最大16中文字。(充值不分区服,
        // 充到统一的用户账户,各区服角色均可使用)。
        bundle.putString(ProtocolKeys.APP_USER_NAME, pay.getAppUserName());

        // 必需参数,应用内的用户id。
        // 若应用内绑定360账号和应用账号,充值不分区服,充到统一的用户账户,各区服角色均可使用,则可用360用户ID最大32字符。
        bundle.putString(ProtocolKeys.APP_USER_ID, pay.getAppUserId());

        // 可选参数,应用扩展信息1,原样返回,最大255字符。
        bundle.putString(ProtocolKeys.APP_EXT_1, pay.getAppExt1());

        // 可选参数,应用扩展信息2,原样返回,最大255字符。
        bundle.putString(ProtocolKeys.APP_EXT_2, pay.getAppExt2());

        // 可选参数,应用订单号,应用内必须唯一,最大32字符。
        bundle.putString(ProtocolKeys.APP_ORDER_ID, pay.getAppOrderId());

        // 必需参数,使用360SDK的支付模块。
        bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_PAY);

        Intent intent = new Intent(appActivity, ContainerActivity.class);
        intent.putExtras(bundle);

        return intent;
    }

    /
      @param moneyAmount
      金额数,使用者可以自由设定数额。金额数为100的整数倍,360SDK运行定额支付流程;
      金额数为0,360SDK运行不定额支付流程。
      @return QihooPay
     /
    private QihooPayInfo getQihooPay(String moneyAmount, String itemName,
            String userName, String roleId, String productId,
            String billNumber, String pauBackUrl, String userId) {

        // String qihooUserId = (mQihooUserInfo != null) ?
        // mQihooUserInfo.getId() : null;

        // 创建QihooPay
        QihooPayInfo qihooPay = new QihooPayInfo();
        qihooPay.setQihooUserId(userId);
        qihooPay.setMoneyAmount(moneyAmount);
        qihooPay.setAccessToken(mAccessToken);
        qihooPay.setExchangeRate("1");

        qihooPay.setProductName(itemName);
        qihooPay.setProductId(productId);

        qihooPay.setNotifyUri(pauBackUrl);

        qihooPay.setAppName("123");
        qihooPay.setAppUserName(userName);
        qihooPay.setAppUserId(roleId);

        // 可选参数
        qihooPay.setAppExt1("ext1");
        qihooPay.setAppExt2("ext2");
        qihooPay.setAppOrderId(billNumber);

        return qihooPay;
    }

    // 支付的回调
        protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                Log.d(TAG, "mPayCallback, data is " + data);
                if (TextUtils.isEmpty(data)) {
                    return;
                }

                boolean isCallbackParseOk = false;
                JSONObject jsonRes;
                try {
                    jsonRes = new JSONObject(data);
                    // error_code 状态码: 0 支付成功, -1 支付取消, 1 支付失败, -2 支付进行中,
                    // 4010201和4009911 登录状态已失效,引导用户重新登录
                    // error_msg 状态描述
                    int errorCode = jsonRes.optInt("error_code");
                    isCallbackParseOk = true;
                    switch (errorCode) {
                    case 0:
                        Log.d(TAG, "支付结果回调成功");

                        break;
                    case 1:
                        Log.d(TAG, "支付失败");
                        break;
                    case -1:
                        Log.d(TAG, "支付取消");
                        break;
                    case -2:
                        isAccessTokenValid = true;
                        isQTValid = true;
                        // String errorMsg = jsonRes.optString("error_msg");
                        // String text =
                        // appActivity.getString(R.string.pay_callback_toast,
                        // errorCode, errorMsg);
                        // Toast.makeText(appActivity, text,
                        // Toast.LENGTH_SHORT).show();
                        break;
                    case 4010201:
                        // acess_token失效
                        isAccessTokenValid = false;
                        // Toast.makeText(appActivity,
                        // R.string.access_token_invalid,
                        // Toast.LENGTH_SHORT).show();
                        break;
                    case 4009911:
                        // QT失效
                        isQTValid = false;
                        // Toast.makeText(appActivity, R.string.qt_invalid,
                        // Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                // 用于测试数据格式是否异常。
                if (!isCallbackParseOk) {
                    // Toast.makeText(appActivity,
                    // appActivity.getResources().getString(R.string.data_format_error),
                    // Toast.LENGTH_LONG).show();
                }
            }
        };

    private void sendUserInfo(String type) {
        HashMap eventParams=new HashMap(); 
        //----------------------------参数设置说明-------------------- 
        //以下列出的五项只是作为参考,请按照上述表格中的参数说明进行补充添加 
        //仅按 demo 样例上传无法通过审核!请务必仔细阅读上述表格! 
        eventParams.put("zoneid",1);//当前角色所在游戏区服 id 
        eventParams.put("zonename","123");//当前角色所在游戏区服名称 
        eventParams.put("roleid","321");//当前角色 id 
        eventParams.put("rolename","111");//当前角色名称 
        eventParams.put("professionid",0);
        eventParams.put("profession","无");
        eventParams.put("gender","无");
        eventParams.put("professionroleid",0);
        eventParams.put("professionrolena me","无");
        eventParams.put("rolelevel","1");
        eventParams.put("power",0);
        eventParams.put("vip",0);
        eventParams.put("balance",0);
        eventParams.put("partyid",0);
        eventParams.put("partyname","无");
        eventParams.put("partyroleid",0);
        eventParams.put("partyrolename","无");
        eventParams.put("friendlist","无");
        eventParams.put("ranking","无");
        eventParams.put("type",type);//角色信息接口触发的场景 
        //---------------------------------------------------------- 
        Matrix.statEventInfo(appContext, eventParams); 
    }

    private void logout() {
        Intent intent = getLogoutIntent();
        Matrix.execute(appActivity, intent, new IDispatcherCallback() {
            @Override
            public void onFinished(String data) {
                Log.d(TAG, "logout_success");
                // Toast.makeText(appActivity, data, Toast.LENGTH_SHORT).show();
                // System.out.println(data);
            }
        });
    }

    private Intent getLogoutIntent() {
        /
          必须参数: function_code : 必须参数,表示调用SDK接口执行的功能
         /
        Intent intent = new Intent();
        intent.putExtra(ProtocolKeys.FUNCTION_CODE,
                ProtocolConfigs.FUNC_CODE_LOGOUT);
        return intent;
    }

    private void exit() {
        Bundle bundle = new Bundle();

        // 界面相关参数,360SDK界面是否以横屏显示。
        bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
                isLandScape);

        // 必需参数,使用360SDK的退出模块。
        bundle.putInt(ProtocolKeys.FUNCTION_CODE,
                ProtocolConfigs.FUNC_CODE_QUIT);

        // 可选参数,登录界面的背景图片路径,必须是本地图片路径
        bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");

        Intent intent = new Intent(appActivity, ContainerActivity.class);
        intent.putExtras(bundle);

        Matrix.invokeActivity(appActivity, intent, mQuitCallback);
    }

    // 退出的回调
        private IDispatcherCallback mQuitCallback = new IDispatcherCallback() {

            @Override
            public void onFinished(String data) {
                // TypeSDKLogger.d( "mQuitCallback, data is " + data);
                JSONObject json;
                try {
                    json = new JSONObject(data);
                    int which = json.optInt("which", -1);
                    // String label = json.optString("label");
                    // Toast.makeText(appActivity,
                    // "按钮标识:" + which + ",按钮描述:" + label, Toast.LENGTH_LONG)
                    // .show();
                    switch (which) {
                    case 0: // 用户关闭退出界面
                        Log.d(TAG, "用户关闭退出界面");
                        return;
                    case 1: //进入论坛
                        Log.d(TAG, "exit_success");
                        System.exit(0);
                        break;
                    case 2://退出游戏
                        Log.d(TAG, "exit_success");
                        System.exit(0);
                        break;
                    default:
                        Log.d(TAG, "exit which:" + which);
                        return;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        };

    private boolean isCancelLogin(String data) {
        try {
            JSONObject joData = new JSONObject(data);
            int errno = joData.optInt("errno", -1);
            if (-1 == errno) {
                // Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
                return true;
            }
        } catch (Exception e) {
        }
        return false;
    }

    private String parseAccessTokenFromLoginResult(String loginRes) {
        try {

            JSONObject joRes = new JSONObject(loginRes);
            JSONObject joData = joRes.getJSONObject("data");
            return joData.getString("access_token");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

再然后,我们需要新创建一个类:

如下图,我们在com.xxx这里右键

06

名字输入:QihooPayInfo

07

这样就会在这边多出一个类文件,我们打开他

08

把下面的代码复制到下图标记处

09

代码:

// 必需参数,用户access token,要使用注意过期和刷新问题,最大64字符。
    private String accessToken;
    // 必需参数,360账号id,整数。
    private String qihooUserId;

    // 必需参数,应用app key。
    private String appKey;

    // 必需参数,值为md5(app_secret +“#”+
    // app_key)全小写,用于签名的密钥不能把app_secret写到应用客户端程序里因此使用这样一个特殊的KEY,应算出值直接写在app中,而不是写md5的计算过程。
    private String privateKey;

    // 必需参数,所购买商品金额,以分为单位。金额大于等于100分,360SDK运行定额支付流程; 金额数为0,360SDK运行不定额支付流程。
    private String moneyAmount;

    // 必需参数,人民币与游戏充值币的默认比例,例如2,代表1元人民币可以兑换2个游戏币,整数。
    private String exchangeRate;

    // 必需参数,所购买商品名称,应用指定,建议中文,最大10个中文字。
    private String productName;

    // 必需参数,购买商品的商品id,应用指定,最大16字符。
    private String productId;

    // 必需参数,应用方提供的支付结果通知uri,最大255字符。360服务器将把支付接口回调给该uri,具体协议请查看文档中,支付结果通知接口–应用服务器提供接口。
    private String notifyUri;

    // 必需参数,游戏或应用名称,最大16中文字。
    private String appName;

    // 必需参数,应用内的用户名,如游戏角色名。 若应用内绑定360账号和应用账号,则可用360用户名,最大16中文字。(充值不分区服,
    // 充到统一的用户账户,各区服角色均可使用)。
    private String appUserName;

    // 必需参数,应用内的用户id。 若应用内绑定360账号和应用账号, 充值不分区服, 充到统一的用户账户, 各区服角色均可使用,
    // 则可用360用户ID。最大32字符。
    private String appUserId;

    // 可选参数,应用扩展信息1,原样返回,最大255字符。
    private String appExt1;

    // 可选参数,应用扩展信息2,原样返回,最大255字符。
    private String appExt2;

    // 可选参数,应用订单号,应用内必须唯一,最大32字符。
    private String appOrderId;

    // 可选参数,支付类型定制
    private String[] payTypes;

    public String[] getPayTypes() {
        return payTypes;
    }

    public void setPayTypes(String[] payTypes) {
        this.payTypes = payTypes;
    }
    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getQihooUserId() {
        return qihooUserId;
    }

    public void setQihooUserId(String qihooUserId) {
        this.qihooUserId = qihooUserId;
    }

    public String getAppKey() {
        return appKey;
    }

    public void setAppKey(String appKey) {
        this.appKey = appKey;
    }

    public String getPrivateKey() {
        return privateKey;
    }

    public void setPrivateKey(String privateKey) {
        this.privateKey = privateKey;
    }

    public String getMoneyAmount() {
        return moneyAmount;
    }

    public void setMoneyAmount(String moneyAmount) {
        this.moneyAmount = moneyAmount;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppUserName() {
        return appUserName;
    }

    public void setAppUserName(String appUserName) {
        this.appUserName = appUserName;
    }

    public String getAppUserId() {
        return appUserId;
    }

    public void setAppUserId(String appUserId) {
        this.appUserId = appUserId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getNotifyUri() {
        return notifyUri;
    }

    public void setNotifyUri(String notifyUri) {
        this.notifyUri = notifyUri;
    }

    public String getExchangeRate() {
        return exchangeRate;
    }

    public void setExchangeRate(String exchangeRate) {
        this.exchangeRate = exchangeRate;
    }

    public String getAppExt1() {
        return appExt1;
    }

    public void setAppExt1(String appExt1) {
        this.appExt1 = appExt1;
    }

    public String getAppExt2() {
        return appExt2;
    }

    public void setAppExt2(String appExt2) {
        this.appExt2 = appExt2;
    }

    public String getAppOrderId() {
        return appOrderId;
    }

    public void setAppOrderId(String appOrderId) {
        this.appOrderId = appOrderId;
    }

至此我们就把所有360上线所需的接口完成了,添加UI并添加相应事件调用相应接口后,就是一个最简单的demo了

如果想要了解具体的接口作用,和相应参数的说明,请继续阅读以下内容,或查看官方文档

第一步初始化:

在Activity onCreate中调用360的初始化接口:(必须在UI线程调用)

private void init() {

// TODO Auto-generated method stub

MatrixCallBack mSDKCallback = new MatrixCallBack() {

@Override

public void execute(Context context, int functionCode, String

functionParams) {

// TODO Auto-generated method stub

if (functionCode == ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT) {

// 调用 sdk 的切换帐号接口

doSdkSwitchAccount(getLandscape(context));

}else if (functionCode == ProtocolConfigs.FUNC_CODE_INITSUCCESS) {

//这里返回成功之后才能调用 SDK 其它接口 TypeSDKLogger.d( "initSDK success");

isInit = true;

}

}

};

// 调用其他SDK接口之前必须先调用init

Matrix.init(appActivity,mSDKCallback);

}

调用登录接口:

/

使用 360SDK 的登录接口, 生成 intent 参数

@param isLandScape 是否横屏显示登录界面

/

private Intent getLoginIntent(boolean isLandScape) {

Intent intent = new Intent(this, ContainerActivity.class);

// 必需参数,使用 360SDK 的登录模块

intent.putExtra(ProtocolKeys.FUNCTION_CODE,

ProtocolConfigs.FUNC_CODE_LOGIN);

// 可选参数,360SDK 界面是否以横屏显示,默认为 true,横屏

intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,

isLandScape);

//可选参数,是否显示关闭按钮,默认不显示

intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON,

getCheckBoxBoolean(R.id.isShowClose));

// 可选参数,是否支持离线模式,默认值为 false

intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE,

getCheckBoxBoolean(R.id.isSupportOffline));

// 可选参数,是否在自动登录的过程中显示切换账号按钮,默认为 false

intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,

getCheckBoxBoolean(R.id.isShowSwitchButton));

// 可选参数,是否隐藏欢迎界面

intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME,

getCheckBoxBoolean(R.id.isHideWellcome));

/

指定界面背景(可选参数):

1.ProtocolKeys.UI_BACKGROUND_PICTRUE 使用的系统路径,如/sdcard/1.png

2.ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS 使用的 assest 中的图片

资源,

如传入 bg.png 字符串,就会在 assets 目录下加载这个指定的文件

3.图片大小不要超过 5M,尺寸不要超过 1280x720,后缀只能是 jpg、jpeg 或 png

/

// 可选参数,登录界面的背景图片路径,必须是本地图片路径

intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,

getUiBackgroundPicPath());

// 可选参数,指定 assets 中的图片路径,作为背景图

intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,

getUiBackgroundPathInAssets());

// 可选参数,是否需要用户输入激活码,用于游戏内测阶段。

// 如果不需激活码相关逻辑,客户传 false 或者不传入该参数。

intent.putExtra(ProtocolKeys.NEED_ACTIVATION_CODE,

getCheckBoxBoolean(R.id.isNeedActivationCode));

//-- 以下参数仅仅针对自动登录过程的控制

// 可选参数,自动登录过程中是否不展示任何 UI,默认展示。

intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI,

getCheckBoxBoolean(R.id.isAutoLoginHideUI));

// 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示

intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,

getCheckBoxBoolean(R.id.isShowDlgOnFailedAutoLogin));

// 社交分享测试参数,发布时要去掉,具体说明见分享接口

// intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG,

// getCheckBoxBoolean(R.id.isDebugSocialShare));

return intent;

}

// 调用接口

protected void doSdkLogin(boolean isLandScape) {

mIsInOffline = false;

Intent intent = getLoginIntent(isLandScape);

IDispatcherCallback callback = mLoginCallback;

if (getCheckBoxBoolean(R.id.isSupportOffline)) {

callback = mLoginCallbackSupportOffline; //离线模式

}

Matrix.execute(this, intent, callback);

}

// 登录接口回调(不支持离线模式)

// 登录、注册的回调

privateIDispatcherCallback mLoginCallback = newIDispatcherCallback() {

@Override

publicvoid onFinished(String data) {

// press back

if (isCancelLogin(data)) {

return;

}

// 显示一下登录结果

Toast.makeText(SdkUserBaseActivity.this, data,

Toast.LENGTH_LONG).show();

mIsInOffline = false;

mQihooUserInfo = null;

// 解析 access_token

mAccessToken = parseAccessTokenFromLoginResult(data);

if (!TextUtils.isEmpty(mAccessToken)) {

// 需要去应用的服务器获取用 access_token 获取一下用户信息

getUserInfo();

} else {

Toast.makeText(SdkUserBaseActivity.this, "get access_token

failed!", Toast.LENGTH_LONG).show();

}

}

};

// 登录结果回调(支持离线模式)

private IDispatcherCallback mLoginCallbackSupportOffline

= new IDispatcherCallback() {

@Override

public void onFinished(String data) {

if (isCancelLogin(data)) {

return;

}

Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data);

try {

JSONObject joRes = new JSONObject(data);

JSONObject joData = joRes.getJSONObject("data");

String mode = joData.optString("mode", "");

if (!TextUtils.isEmpty(mode) && mode.equals("offline")) 、

{

Toast.makeText(SdkUserBaseActivity.this,

"login success in offline mode",

Toast.LENGTH_SHORT).show();

mIsInOffline = true;

// 显示一下登录结果

Toast.makeText(SdkUserBaseActivity.this, data,

Toast.LENGTH_LONG).show();

} else {

mLoginCallback.onFinished(data);

}

} catch (Exception e) {

Log.e(TAG, "mLoginCallbackSupportOffline exception", e);

}

}

};

private boolean isCancelLogin(String data) {

try {

JSONObject joData = new JSONObject(data);

int errno = joData.optInt("errno", -1);

if (-1 == errno) {

// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();

return true;

}

} catch (Exception e) {

}

return false;

}

private String parseAccessTokenFromLoginResult(String loginRes) {

try {

JSONObject joRes = new JSONObject(loginRes);

JSONObject joData = joRes.getJSONObject("data");

return joData.getString("access_token");

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

调用支付接口:

注意:

1、 必选参数不能为空, 不能为 0,否则支付失败。

2、 参数名,以 ProtocolKeys 中定义的常量为准。

3、 请务必对 case 0、1、-1 加入处理语句,如果为空的会导致游戏崩溃。

/

使用 360SDK 的支付接口

@param isLandScape 是否横屏显示支付界面

@param isFixed 是否定额支付

@param functioncode 标示支付模块类型。

/

protected void doSdkPay(QihooUserInfo usrinfo, boolean isLandScape,int functionCode) {

if(!isAccessTokenValid) {

Toast.makeText(SdkUserBaseActivity.this, R.string.access_token_invalid,

Toast.LENGTH_SHORT).show();

return;

}

if(!isQTValid) {

Toast.makeText(SdkUserBaseActivity.this, R.string.qt_invalid,

Toast.LENGTH_SHORT).show();

return;

}

boolean isFixed = getCheckBoxBoolean(R.id.isPayFixed);

// 支付基础参数

QihooPayInfo payInfo = getQihooPay(

price,//_in_pay.GetData(AttName.REAL_PRICE)

_in_pay.GetData(AttName.ITEM_NAME).isEmpty()?"商品

":_in_pay.GetData(AttName.ITEM_NAME),

userInfo.GetData(AttName.ROLE_NAME).isEmpty() ? "玩家" :

userInfo.GetData(AttName.ROLE_NAME),

userInfo.GetData(AttName.ROLE_ID).isEmpty()?"1":

userInfo.GetData(AttName.ROLE_ID),

_in_pay.GetData(AttName.ITEM_SERVER_ID).isEmpty()?"1":

_in_pay.GetData(AttName.ITEM_SERVER_ID),

_in_pay.GetData(AttName.BILL_NUMBER),

platform.GetData(AttName.PAY_CALL_BACK_URL),

userInfo.GetData(AttName.USER_ID));

Intent intent = getPayIntent(isLandScape, isFixed, functionCode);

// 必需参数,使用 360SDK 的支付模块:CP 可以根据需求选择使用 带有收银台的支付模

// 块 或者 直接 调用微信支付模块或者直接调用支付宝支付模块。

// functionCode 对应三种类型的支付模块:

// ProtocolConfigs.FUNC_CODE_PAY;//支付模块。(有收银台,显示多种支付方式) // ProtocolConfigs.FUNC_CODE_WEIXIN_PAY;//微信支付模块。

//(无收银台,直接用微信进行支付)

//ProtocolConfigs.FUNC_CODE_ALI_PAY;

//支付宝支付模块。(无收银台,直接用支付宝进行支付)

intent.putExtra(ProtocolKeys.FUNCTION_CODE, functionCode);

// 可选参数,登录界面的背景图片路径,必须是本地图片路径

intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");

Matrix.invokeActivity(this, intent, mPayCallback);

}

/

@param moneyAmount

金额数,使用者可以自由设定数额。金额数为100的整数倍,360SDK运行定额支付流程;

金额数为0,360SDK运行不定额支付流程。

@return QihooPay

/

private QihooPayInfo getQihooPay(String moneyAmount, String itemName,

String userName, String roleId, String productId,

String billNumber, String pauBackUrl, String userId) {

// String qihooUserId = (mQihooUserInfo != null) ?

// mQihooUserInfo.getId() : null;

// 创建QihooPay

QihooPayInfo qihooPay = new QihooPayInfo();

qihooPay.setQihooUserId(userId);

qihooPay.setMoneyAmount(moneyAmount);

qihooPay.setAccessToken(mAccessToken);

qihooPay.setExchangeRate("1");

qihooPay.setProductName(itemName);

qihooPay.setProductId(productId);

qihooPay.setNotifyUri(pauBackUrl);

qihooPay.setAppName(platform.GetData(AttName.CP_ID));

qihooPay.setAppUserName(userName);

qihooPay.setAppUserId(roleId);

// 可选参数

qihooPay.setAppExt1("ext1");

qihooPay.setAppExt2("ext2");

qihooPay.setAppOrderId(billNumber);

return qihooPay;

}

/

生成调用 360SDK 支付接口基础参数的 Intent

@param isLandScape 是否横屏显示登录界面

@param isFixed 是否定额支付

@return Intent

/

protected Intent getPayIntent(boolean isLandScape, boolean isFixed) {

Bundle bundle = new Bundle();

QihooPayInfo pay = getQihooPayInfo(isFixed);

// 界面相关参数,360SDK 界面是否以横屏显示。

bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);

// 可选参数,登录界面的背景图片路径,必须是本地图片路径

bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");

// 以下非界面相关参数

// 设置 QihooPay 中的参数。

// 必需参数,用户 access token,要使用注意过期和刷新问题,最大 64 字符。 bundle.putString(ProtocolKeys.ACCESS_TOKEN, pay.getAccessToken());

// 必需参数,360 账号 id。

bundle.putString(ProtocolKeys.QIHOO_USER_ID, pay.getQihooUserId());

//必需参数,所购买商品金额, 以分为单位。金额大于等于 100 分,360SDK 运行定额支

//付流程; 金 额数为 0,360SDK 运行不定额支付流程。

bundle.putString(ProtocolKeys.AMOUNT, pay.getMoneyAmount());

// 必需参数,所购买商品名称,应用指定,建议中文,最大 10 个中文字。

bundle.putString(ProtocolKeys.PRODUCT_NAME, pay.getProductName());

// 必需参数,购买商品的商品 id,应用指定,最大 16 字符。

bundle.putString(ProtocolKeys.PRODUCT_ID, pay.getProductId());

// 必需参数,应用方提供的支付结果通知 uri,最大 255 字符。360 服务器将把支付接口

//回调给该 uri, 具体协议请查看文档中,支付结果通知接口–应用服务器提供接口。

bundle.putString(ProtocolKeys.NOTIFY_URI, pay.getNotifyUri());

// 必需参数,游戏或应用名称,最大 16 中文字。

bundle.putString(ProtocolKeys.APP_NAME, pay.getAppName());

// 必需参数,应用内的用户名,如游戏角色名。 若应用内绑定 360 账号和应用账号,则

//可用 360 用户 名,最大 16 中文字。(充值不分区服,充到统一的用户账户,各区服角

//色均可使用)。

bundle.putString(ProtocolKeys.APP_USER_NAME, pay.getAppUserName());

// 必需参数,应用内的用户 id。 // 若应用内绑定 360 账号和应用账号,充值

//不分区服,充到统一的用户账户,各区服角色均可使用, 则可用 360 用户 ID 最大 32 //字符。

bundle.putString(ProtocolKeys.APP_USER_ID, pay.getAppUserId());

// 必需参数,应用订单号,应用内必须唯一,最大 32 字符。

bundle.putString(ProtocolKeys.APP_ORDER_ID, pay.getAppOrderId());

// 可选参数,应用扩展信息 1,原样返回,最大 255 字符。

bundle.putString(ProtocolKeys.APP_EXT_1, pay.getAppExt1());

// 可选参数,应用扩展信息 2,原样返回,最大 255 字符。

bundle.putString(ProtocolKeys.APP_EXT_2, pay.getAppExt2());

Intent intent = new Intent(this, ContainerActivity.class);

intent.putExtras(bundle);

return intent;

}

/

支付的回调

/

protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {

@Override

public void onFinished(String data) {

Log.d(TAG, "mPayCallback, data is " + data);

if(TextUtils.isEmpty(data)) {

return;

}

boolean isCallbackParseOk = false;

JSONObject jsonRes;

try {

jsonRes = new JSONObject(data);

// error_code 状态码:0 支付成功,-1 支付取消,1 支付失败,-2 支付进行中。

// 请务必对 case 0、1、-1 加入处理语句,如果为空会导致游戏崩溃 // error_msg 状态描述

int errorCode = jsonRes.optInt("error_code");

isCallbackParseOk = true;

switch (errorCode) {

case 0:

case 1:

case -1:

case -2: {

isAccessTokenValid = true;

String errorMsg = jsonRes.optString("error_msg");

String text = getString(R.string.pay_callback_toast, errorCode, errorMsg);

Toast.makeText(SdkUserBaseActivity.this, text, Toast.LENGTH_SHORT).show();

}

break;

case 4010201:

isAccessTokenValid = false;

Toast.makeText(SdkUserBaseActivity.this, R.string.access_token_invalid,

Toast.LENGTH_SHORT).show();

break;

case 4009911:

//QT 失效

isQTValid = false;

Toast.makeText(SdkUserBaseActivity.this, R.string.qt_invalid,

Toast.LENGTH_SHORT).show();

break;

default:

break;

}

} catch (JSONException e) {

e.printStackTrace();

}

// 用于测试数据格式是否异常。

if (!isCallbackParseOk) {

Toast.makeText(SdkUserBaseActivity.this, getString(R.string.data_format_error),

Toast.LENGTH_LONG).show();

}

}

};

接入提交游戏角色数据信息:(可选客户端接入还是服务端接入,以下只展示客户端接入示例)

数据提交时机:

1、玩家进入游戏区服时调用该接口。

2、角色创建时调用该接口。

3、角色升级时调用该接口。

4、角色退出游戏时调用该接口。

/

角色信息采集接口

/

protected void doSdkGetUserInfoByCP() {

HashMap eventParams=new HashMap();

//----------------------------参数设置说明--------------------

//以下列出的五项只是作为参考,请按照上述表格中的参数说明进行补充添加

eventParams.put("zoneid",1);//当前角色所在游戏区服 id

eventParams.put("zonename","刀塔传奇 1 区");//当前角色所在游戏区服名称 eventParams.put("roleid","12345678");//当前角色 id

eventParams.put("rolename","三国风吹来的鱼");//当前角色名称 eventParams.put("type","levelUp");//角色信息接口触发的场景

//----------------------------------------------------------

Matrix.statEventInfo(getApplicationContext(), eventParams);

}

参数说明:

接入切换账号接口:

/

使用 360SDK 的切换账号接口

@param isLandScape 是否横屏显示登录界面

/

protected void doSdkSwitchAccount(boolean isLandScape) {

Intent intent = getSwitchAccountIntent(isLandScape);

if (isSupportOffline) {

callback = mAccountSwitchSupportOfflineCB;//离线模式

}

Matrix.invokeActivity(this, intent, mAccountSwitchCallback);

}

/

生成调用360SDK切换账号接口的Intent

@param isLandScape

是否横屏

@param isBgTransparent

是否背景透明

@param clientId

即AppKey

@return Intent

/

private Intent getSwitchAccountIntent(boolean isLandScape) {

Intent intent = new Intent(appActivity, ContainerActivity.class);

// 界面相关参数,360SDK界面是否以横屏显示。

intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,

isLandScape);

// 必需参数,使用360SDK的切换账号模块。

intent.putExtra(ProtocolKeys.FUNCTION_CODE,

ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);

// 是否显示关闭按钮

intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);

// 可选参数,是否支持离线模式,默认值为false

intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);

// 可选参数,是否在自动登录的过程中显示切换账号按钮

intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,

isShowSwitchButton);

// 可选参数,是否隐藏欢迎界面

intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);

// 可选参数,登录界面的背景图片路径,必须是本地图片路径

// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,

// getUiBackgroundPicPath());

// 可选参数,指定assets中的图片路径,作为背景图

// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,

// getUiBackgroundPathInAssets());

// -- 以下参数仅仅针对自动登录过程的控制

// 可选参数,自动登录过程中是否不展示任何UI,默认展示。

intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);

// 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示

intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,

isShowDlgOnFailedAutoLogin);

// 测试参数,发布时要去掉

intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);

return intent;

}

// 切换账号的回调

private IDispatcherCallback mAccountSwitchCallback = new IDispatcherCallback() {

@Override

public void onFinished(String data) {

// press back

if (isCancelLogin(data)) {

return;

}

// 显示一下登录结果

// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();

// TypeSDKLogger.d( "mAccountSwitchCallback, data is " + data);

// 解析access_token

mAccessToken = parseAccessTokenFromLoginResult(data);

}

};

// 支持离线模式的切换账号的回调

private IDispatcherCallback mAccountSwitchSupportOfflineCB = new IDispatcherCallback() {

@Override

public void onFinished(String data) {

// press back

if (isCancelLogin(data)) {

return;

}

// 显示一下登录结果

// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();

// TypeSDKLogger.d( "mAccountSwitchSupportOfflineCB, data is " + data);

// 解析access_token

mAccessToken = parseAccessTokenFromLoginResult(data);

}

};

parseAccessTokenFromLoginResult (String data) 此函数登录时就有用到,解析TOKEN

接入退出接口:

/

使用 360SDK 的退出接口

@param isLandScape 是否横屏显示支付界面

/

protected void doSdkQuit(boolean isLandScape) {

Bundle bundle = new Bundle();

// 界面相关参数,360SDK 界面是否以横屏显示。

bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);

// 可选参数,登录界面的背景图片路径,必须是本地图片路径

bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");

// 必需参数,使用 360SDK 的退出模块。

bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_QUIT);

Intent intent = new Intent(this, ContainerActivity.class);

intent.putExtras(bundle);

Matrix.invokeActivity(this, intent, mQuitCallback);

}

// 退出的回调

private IDispatcherCallback mQuitCallback = new IDispatcherCallback() {

@Override

public void onFinished(String data) {

// TODO your job

}

};

接入销毁接口:

@Override

protected void onDestroy() {

super.onDestroy();

Matrix.destroy(this);

}

游戏 activity 生命周期接口:

//游戏 Activity 必接 生命周期接口

public static void onStart(Activity activity)

//游戏 Activity 必接生命周期接口

public static void onResume(Activity activity)

//游戏 Activity 必接生命周期接口

public static void onPause(Activity activity)

//游戏 Activity 必接生命周期接口

public static void onStop(Activity activity)

//游戏 Activity 必接生命周期接口

public static void onReStart(Activity activity)

//游戏 Activity 必接生命周期接口

public static void onActivityResult (Activity activity,int requestCode, int resultCode, Intent data)

//游戏 Activity 必接生命周期接口

public static void onNewIntent (Activity activity,Intent intent)

代码混淆要求

如果游戏发布时采用proguard进行代码混淆,请在proguard配置文件加入以下代码,以避免对SDK进行混淆,否则会造成SDK部分功能不正常。

-keep class a.a.a. { ; }

-keep class cn.pp. { ; }

-keep class com.alipay. {;}

-keep class com.qihoo. {;}

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

-keep class com.qihoopp. { ; }

-keep class com.yeepay.safekeyboard. { ; }

-keep class com.amap. {;}

-keep class com.aps. {*;}

-keep class com.iapppay. {;}

-keep class com.ipaynow. {;}

-keep class com.junnet.heepay. {;}

-keep class com.tencent.mm. {;}

-keep class com.ta.utdid2.** {;}

-keep class com.ut.device. {;}

-keep class com.qihoo.sdkplugging.host. {;}

-keep public class com.qihoo.gamecenter.sdk.matrix.PluggingHostProxy {;}

-dontwarn cn.pp.

-dontwarn com.alipay.android.app.

-dontwarn com.qihoo.

-dontwarn com.qihoo360.

-dontwarn com.qihoopp.

-dontwarn com.yeepay.safekeyboard.

-dontwarn com.amap.**

-dontwarn org.apache.http.conn.ssl.SSLSocketFactory

如果想了解更多,请联系我们或关注官网

了解更多:www.typesdk.com问题解答:1771930259联系邮箱:qianyuzhou@typesdk.com项目地址:https://github.com/typesdk


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号