Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307844
  • 博文数量: 65
  • 博客积分: 2570
  • 博客等级: 少校
  • 技术积分: 730
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 14:04
个人简介

苦逼房奴一枚

文章分类

全部博文(65)

文章存档

2017年(19)

2016年(5)

2013年(6)

2012年(1)

2011年(3)

2009年(5)

2008年(26)

我的朋友

分类: Android平台

2017-06-14 18:43:16

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

 

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

 

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

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

 

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

我这边的接入环境是Eclipse

 

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



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

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

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

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


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

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


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

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

 

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

然后复制以下代码

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.example.demo"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >

  6.     <uses-sdk
  7.         android:minSdkVersion="8"
  8.         android:targetSdkVersion="18" />

  9.     <supports-screens
  10.         android:anyDensity="true"
  11.         android:largeScreens="true"
  12.         android:normalScreens="true"
  13.         android:resizeable="true"
  14.         android:smallScreens="true" />

  15.     <!-- 亲加sdk所需权限 -->
  16.     <uses-permission android:name="android.permission.RECORD_AUDIO" />
  17.     <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
  18.     <uses-permission android:name="android.permission.SET_WALLPAPER" />
  19.     <uses-permission android:name="android.permission.BATTERY_STATS" />
  20.     <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
  21.     <uses-permission android:name="android.permission.GET_TASKS" />
  22.     <uses-permission android:name="android.permission.RESTART_PACKAGES" />
  23.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  24.     <uses-permission android:name="android.permission.INTERNET" />
  25.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  26.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  27.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  28.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  29.     <uses-permission android:name="android.permission.READ_LOGS" />
  30.     <uses-permission android:name="android.permission.READ_SMS" />
  31.     <uses-permission android:name="android.permission.READ_CONTACTS" />
  32.     <uses-permission android:name="android.permission.WRITE_SMS" />
  33.     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
  34.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  35.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  36.     <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
  37.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  38.     <uses-permission android:name="android.permission.RECORD_AUDIO" />
  39.     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  40.     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
  41.     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
  42.     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
  43.     <uses-permission android:name="android.permission.WAKE_LOCK" />

  44.     <!-- 添加360SDK必需要的权限。begin -->
  45.     <uses-permission android:name="android.permission.INTERNET" />
  46.     <uses-permission android:name="android.permission.SEND_SMS" />
  47.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  48.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  49.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  50.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  51.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  52.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  53.     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  54.     <uses-permission android:name="android.permission.READ_CONTACTS" />
  55.     <uses-permission android:name="android.permission.WRITE_SMS" />

  56.     <!-- payment -->
  57.     <uses-permission android:name="android.permission.GET_TASKS" />
  58.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  59.     <uses-permission android:name="android.permission.RECEIVE_SMS" />
  60.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  61.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  62.     <uses-permission android:name="android.permission.RESTART_PACKAGES" />
  63.     <uses-permission android:name="android.webkit.permission.PLUGIN" />
  64.     <!-- 浮窗 -->
  65.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  66.     <uses-permission android:name="android.permission.VIBRATE" />

  67.     <!-- 微信分享相关 -->
  68.     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

  69.     <!-- qiku start -->
  70.     <!-- 系统账户操作权限 -->
  71.     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  72.     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
  73.     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
  74.     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
  75.     <!-- 系统设置操作权限 -->
  76.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  77.     <uses-permission android:name="android.permission.READ_SETTINGS" />
  78.     <!-- qiku end -->


  79.     <!-- QDAS打点SDK所需权限 -->
  80.     <uses-permission android:name="android.permission.READ_LOGS" />

  81.     <!-- 添加360SDK必需要的权限。end -->

  82.     <application
  83.         android:name="com.qihoo.gamecenter.sdk.matrix.QihooApplication"
  84.         android:allowBackup="false"
  85.         android:icon="@drawable/demo_icon"
  86.         android:label="@string/demo_app_name" >
  87.         <activity
  88.             android:name=".MainActivity"
  89.             android:label="@string/app_name" >
  90.             <intent-filter>
  91.                 <action android:name="android.intent.action.MAIN" />

  92.                 <category android:name="android.intent.category.LAUNCHER" />
  93.             </intent-filter>
  94.         </activity>
  95.         <!-- 添加360SDK必需的activity:com.qihoopay.insdk.activity.ContainerActivity -->
  96.         <activity
  97.             android:name="com.qihoo.gamecenter.sdk.activity.ContainerActivity"
  98.             android:configChanges="fontScale|orientation|keyboardHidden|locale|navigation|screenSize|uiMode|layoutDirection"
  99.             android:exported="true"
  100.             android:theme="@android:style/Theme.Translucent.NoTitleBar" >

  101.             <!-- 支付宝签约后自动跳转到sdk配置 -->
  102.             <intent-filter>
  103.                 <action android:name="android.intent.action.MAIN" />
  104.                 <action android:name="android.intent.action.VIEW" />

  105.                 <category android:name="android.intent.category.DEFAULT" />
  106.                 <category android:name="android.intent.category.BROWSABLE" />
  107.                 <!-- android host的值必须为游戏的包名 -->
  108.                 <data android:host="com.example.demo" />
  109.                 <!-- android scheme的值必须不能变 -->
  110.                 <data android:scheme="qihooonlinepay" />
  111.             </intent-filter>
  112.         </activity>

  113.         <!-- payment activities begin -->
  114.         <!-- 添加360SDK必需的activity:com.qihoopp.qcoinpay.QcoinActivity -->
  115.         <activity
  116.             android:name="com.qihoopp.qcoinpay.QcoinActivity"
  117.             android:configChanges="fontScale|orientation|keyboardHidden|locale|navigation|screenSize|uiMode"
  118.             android:theme="@android:style/Theme.Translucent.NoTitleBar"
  119.             android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >
  120.         </activity>

  121.         <!-- alipay sdk begin -->
  122.         <activity
  123.             android:name="com.alipay.sdk.app.H5PayActivity"
  124.             android:screenOrientation="portrait" >
  125.         </activity>
  126.         <!-- alipay sdk end -->


  127.         <!-- 微信支付界面 -->
  128.         <activity
  129.             android:name="com.iapppay.pay.channel.weixinpay.WeixinWapPayActivity"
  130.             android:configChanges="screenSize|orientation|keyboard|navigation|layoutDirection"
  131.             android:theme="@android:style/Theme.Translucent" />
  132.         <activity
  133.             android:name="com.junnet.heepay.ui.activity.WelcomeActivity"
  134.             android:configChanges="keyboardHidden|orientation|screenSize"
  135.             android:excludeFromRecents="true"
  136.             android:screenOrientation="behind"
  137.             android:theme="@android:style/Theme.Dialog"
  138.             android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
  139.         <activity
  140.             android:name="com.junnet.heepay.ui.activity.WechatPaymentActivity"
  141.             android:configChanges="keyboardHidden|orientation|screenSize"
  142.             android:excludeFromRecents="true"
  143.             android:screenOrientation="behind"
  144.             android:theme="@android:style/Theme.Dialog"
  145.             android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
  146.         <activity
  147.             android:name="com.ipaynow.plugin.activity.PayMethodActivity"
  148.             android:configChanges="keyboardHidden|orientation|screenSize"
  149.             android:exported="false"
  150.             android:screenOrientation="behind"
  151.             android:theme="@android:style/Theme.Dialog" />
  152.         <activity
  153.             android:name="com.ipaynow.plugin.inner_plugin.wechat_plugin.activity.WeChatNotifyActivity"
  154.             android:configChanges="keyboardHidden|orientation|screenSize"
  155.             android:screenOrientation="behind"
  156.             android:theme="@android:style/Theme.NoDisplay" />

  157.         <!-- 以下两个Activity是SDK插件化使用的代理Activity -->
  158.         <activity
  159.             android:name="com.qihoo.sdkplugging.host.HostProxyActivity"
  160.             android:configChanges="fontScale|orientation|keyboardHidden|locale|navigation|screenSize|uiMode|layoutDirection"
  161.             android:label="360SDK"
  162.             android:theme="@android:style/Theme.Translucent.NoTitleBar" >
  163.             <intent-filter>
  164.                 <action android:name="com.qihoo.sdkplugging.host.proxy.activity.VIEW" />

  165.                 <category android:name="android.intent.category.DEFAULT" />
  166.             </intent-filter>
  167.         </activity>

  168.         <!-- payment activities end -->

  169.         <meta-data
  170.             android:name="QHOPENSDK_APPKEY"
  171.             android:value="@app_key@" >
  172.         </meta-data>
  173.         <meta-data
  174.             android:name="QHOPENSDK_PRIVATEKEY"
  175.             android:value="@private_key@" >
  176.         </meta-data>
  177.         <meta-data
  178.             android:name="QHOPENSDK_APPID"
  179.             android:value="@app_id@" >
  180.         </meta-data>

  181.         <!-- 如下是360游戏实时推送SDK必要声明,不可修改 -->
  182.         <receiver
  183.             android:name="com.qihoo.psdk.local.QBootReceiver"
  184.             android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
  185.             <intent-filter>
  186.                 <action android:name="android.intent.action.BOOT_COMPLETED" />
  187.             </intent-filter>
  188.             <intent-filter>
  189.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  190.             </intent-filter>
  191.         </receiver>

  192.         <activity
  193.             android:name="com.qihoo.psdk.app.QStatActivity"
  194.             android:launchMode="singleInstance"
  195.             android:theme="@android:style/Theme.Translucent.NoTitleBar" >
  196.         </activity>

  197.         <service
  198.             android:name="com.qihoo.psdk.remote.QRemoteService"
  199.             android:exported="true"
  200.             android:process=":QRemote" >
  201.             <intent-filter>
  202.                 <action android:name="com.qihoo.psdk.service.action.remote" />
  203.             </intent-filter>
  204.         </service>
  205.         <service
  206.             android:name="com.qihoo.psdk.local.QLocalService"
  207.             android:exported="true"
  208.             android:process=":QLocal" >
  209.             <intent-filter>
  210.                 <action android:name="com.qihoo.psdk.service.action.local" />
  211.             </intent-filter>
  212.         </service>
  213.         <!-- 推送SDK end -->


  214.         <!-- 微信SDK -->
  215.         <!-- 微信相关的activity,如果游戏接入微信分享需要在游戏工程内实现这个activity,请直接使用demo中的代码实现,并放在游戏的工程的对应路径下。 -->
  216.         <activity
  217.             android:name=".wxapi.WXEntryActivity"
  218.             android:exported="true"
  219.             android:label="@string/app_name"
  220.             android:theme="@android:style/Theme.Translucent.NoTitleBar" />

  221.         <!-- 从微信开放平台申请的appid,游戏需要去申请自己的appid -->
  222.         <meta-data
  223.             android:name="QHOPENSDK_WEIXIN_APPID"
  224.             android:value="@wx_app_id@" >
  225.         </meta-data>
  226.         <!-- 注意:此处的微信 appid 申请只与微信分享有关,微信支付功能无需 appid 即可使用 -->
  227.         <!-- 微信SDK end -->


  228.         <!-- UpdateLib start -->
  229.         <activity
  230.             android:name="com.qihoo.updatesdk.lib.UpdateTipDialogActivity"
  231.             android:configChanges="keyboardHidden|orientation|screenSize"
  232.             android:exported="false"
  233.             android:screenOrientation="portrait"
  234.             android:theme="@android:style/Theme.Translucent.NoTitleBar" />

  235.         <service
  236.             android:name="com.qihoo.appstore.updatelib.CheckUpdateService"
  237.             android:exported="false" />
  238.         <!-- UpdateLib end -->


  239.         <!-- gameunion plugin start -->
  240.         <activity
  241.             android:name="com.qihoo.gameunionforsdk.SimpleWebView"
  242.             android:configChanges="fontScale|orientation|keyboardHidden|locale|navigation|screenSize|uiMode|layoutDirection"
  243.             android:theme="@android:style/Theme.Translucent.NoTitleBar" />
  244.         <!-- gameunion plugin end -->


  245.         <!-- 默认参数,不需要修改,直接复制就行 -->
  246.         <meta-data
  247.             android:name="DC_APPKEY"
  248.             android:value="02522a2b2726fb0a03bb19f2d8d9524d" />
  249.     </application>

  250. </manifest>

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

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

这样AndroidManifest.xml修改好了。

 

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

首先打开我们的MainActivity.java

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


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


点击(此处)折叠或打开

  1. import java.util.HashMap;

  2. import org.json.JSONException;
  3. import org.json.JSONObject;

  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.res.Configuration;
  8. import android.os.Bundle;
  9. import android.text.TextUtils;
  10. import android.util.Log;

  11. import com.qihoo.gamecenter.sdk.activity.ContainerActivity;
  12. import com.qihoo.gamecenter.sdk.common.IDispatcherCallback;
  13. import com.qihoo.gamecenter.sdk.matrix.Matrix;
  14. import com.qihoo.gamecenter.sdk.protocols.CPCallBackMgr.MatrixCallBack;
  15. import com.qihoo.gamecenter.sdk.protocols.ProtocolConfigs;
  16. import com.qihoo.gamecenter.sdk.protocols.ProtocolKeys;

  17. public class MainActivity extends Activity {

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

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

  44.     }
  45.     
  46.     @Override
  47.     protected void onPause() {
  48.         // TODO Auto-generated method stub
  49.         super.onPause();
  50.         Matrix.onPause(appActivity);
  51.     }

  52.     @Override
  53.     protected void onRestart() {
  54.         // TODO Auto-generated method stub
  55.         super.onRestart();
  56.         Matrix.onRestart(appActivity);
  57.     }

  58.     @Override
  59.     protected void onResume() {
  60.         // TODO Auto-generated method stub
  61.         super.onResume();
  62.         Matrix.onResume(appActivity);
  63.     }

  64.     @Override
  65.     protected void onStart() {
  66.         // TODO Auto-generated method stub
  67.         super.onStart();
  68.         Matrix.onStart(appActivity);
  69.     }

  70.     @Override
  71.     protected void onStop() {
  72.         // TODO Auto-generated method stub
  73.         super.onStop();
  74.         Matrix.onStop(appActivity);
  75.     }

  76.     @Override
  77.     protected void onDestroy() {
  78.         // TODO Auto-generated method stub
  79.         super.onDestroy();
  80.         Matrix.destroy(this);
  81.     }

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

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

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

  97.             @Override
  98.             public void execute(Context context, int functionCode,
  99.                     String functionParams) {
  100.                 // TODO Auto-generated method stub
  101.                 if (functionCode == ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT) {
  102.                     // 调用 sdk 的切换帐号接口
  103.                     doSdkSwitchAccount(getLandscape(context));
  104.                 } else if (functionCode == ProtocolConfigs.FUNC_CODE_INITSUCCESS) {
  105.                     // 这里返回成功之后才能调用 SDK 其它接口 TypeSDKLogger.d(
  106.                     // "initSDK success");
  107.                     isInit = true;
  108.                 }
  109.             }
  110.         };
  111.         // 调用其他SDK接口之前必须先调用init
  112.         Matrix.init(appActivity, mSDKCallback);
  113.     }
  114.     
  115.     protected boolean getLandscape(Context context) {
  116.         if (context == null) {
  117.             return false;
  118.         }
  119.         boolean landscape = (context.getResources().getConfiguration().orientation
  120.                 == Configuration.ORIENTATION_LANDSCAPE);
  121.         return landscape;
  122.     }
  123.     
  124.     /**
  125.      * 使用360SDK的切换账号接口
  126.      *
  127.      * @param isLandScape
  128.      * 是否横屏显示登录界面
  129.      */
  130.     protected void doSdkSwitchAccount(boolean isLandScape) {
  131.         Intent intent = getSwitchAccountIntent(isLandScape);
  132.         IDispatcherCallback callback = mAccountSwitchCallback;
  133.         if (isSupportOffline) {
  134.             callback = mAccountSwitchSupportOfflineCB;
  135.         }
  136.         Matrix.invokeActivity(appActivity, intent, callback);
  137.     }
  138.     
  139.     /***
  140.      * 生成调用360SDK切换账号接口的Intent
  141.      *
  142.      * @param isLandScape
  143.      * 是否横屏
  144.      * @param isBgTransparent
  145.      * 是否背景透明
  146.      * @param clientId
  147.      * 即AppKey
  148.      * @return Intent
  149.      */
  150.     private Intent getSwitchAccountIntent(boolean isLandScape) {
  151.         Intent intent = new Intent(appActivity, ContainerActivity.class);

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

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

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

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

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

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

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

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

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

  181.         return intent;
  182.     }
  183.     
  184.     // 切换账号的回调
  185.         private IDispatcherCallback mAccountSwitchCallback = new IDispatcherCallback() {

  186.             @Override
  187.             public void onFinished(String data) {
  188.                 // press back
  189.                 if (isCancelLogin(data)) {
  190.                     return;
  191.                 }

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

  194.                 // TypeSDKLogger.d( "mAccountSwitchCallback, data is " + data);
  195.                 // 解析User info
  196. //                QihooUserInfo info = parseUserInfoFromLoginResult(data);
  197.                 // 解析access_token
  198.                 mAccessToken = parseAccessTokenFromLoginResult(data);
  199.             }
  200.         };

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

  203.             @Override
  204.             public void onFinished(String data) {
  205.                 // press back
  206.                 if (isCancelLogin(data)) {
  207.                     return;
  208.                 }
  209.                 // 显示一下登录结果
  210.                 // Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
  211.                 // TypeSDKLogger.d( "mAccountSwitchSupportOfflineCB, data is " + data);
  212.                 // 解析User info
  213.                 // 解析access_token
  214.                 mAccessToken = parseAccessTokenFromLoginResult(data);
  215.             }
  216.         };

  217.     private void login() {
  218.         mIsInOffline = false;
  219.         Intent intent = getLoginIntent(isLandScape);
  220.         IDispatcherCallback callback = mLoginCallback;
  221.         if (isSupportOffline) {
  222.             callback = mLoginCallbackSupportOffline;
  223.         }
  224.         Matrix.execute(appActivity, intent, callback);
  225.     }
  226.     
  227.     /**
  228.      * 生成调用360SDK登录接口的Intent
  229.      *
  230.      * @param isLandScape
  231.      * 是否横屏
  232.      * @return intent
  233.      */
  234.     private Intent getLoginIntent(boolean isLandScape) {

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

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

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

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

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

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

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

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

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

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

  265.         return intent;
  266.     }
  267.     
  268.     // 登录、注册的回调
  269.         private IDispatcherCallback mLoginCallback = new IDispatcherCallback() {

  270.             @Override
  271.             public void onFinished(String data) {
  272.                 // press back
  273.                 if (isCancelLogin(data)) {
  274. //                    doSdkLogin(true);
  275.                     return;
  276.                 }

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

  284.         private IDispatcherCallback mLoginCallbackSupportOffline = new IDispatcherCallback() {

  285.             @Override
  286.             public void onFinished(String data) {
  287.                 if (isCancelLogin(data)) {
  288.                     return;
  289.                 }

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

  312.             }
  313.         };

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

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

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

  330.         // 启动接口
  331.         Matrix.invokeActivity(appActivity, intent, mPayCallback);
  332.     }
  333.     
  334.     /***
  335.      * 生成调用360SDK支付接口的Intent
  336.      *
  337.      * @param isLandScape
  338.      * @param pay
  339.      * @return Intent
  340.      */
  341.     protected Intent getPayIntent(boolean isLandScape, QihooPayInfo pay) {
  342.         Bundle bundle = new Bundle();

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

  346.         // *** 以下非界面相关参数 ***

  347.         // 设置QihooPay中的参数。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  380.         return intent;
  381.     }
  382.     
  383.     /***
  384.      * @param moneyAmount
  385.      * 金额数,使用者可以自由设定数额。金额数为100的整数倍,360SDK运行定额支付流程;
  386.      * 金额数为0,360SDK运行不定额支付流程。
  387.      * @return QihooPay
  388.      */
  389.     private QihooPayInfo getQihooPay(String moneyAmount, String itemName,
  390.             String userName, String roleId, String productId,
  391.             String billNumber, String pauBackUrl, String userId) {

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

  394.         // 创建QihooPay
  395.         QihooPayInfo qihooPay = new QihooPayInfo();
  396.         qihooPay.setQihooUserId(userId);
  397.         qihooPay.setMoneyAmount(moneyAmount);
  398.         qihooPay.setAccessToken(mAccessToken);
  399.         qihooPay.setExchangeRate("1");

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

  402.         qihooPay.setNotifyUri(pauBackUrl);

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

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

  410.         return qihooPay;
  411.     }
  412.     
  413.     // 支付的回调
  414.         protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {

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

  421.                 boolean isCallbackParseOk = false;
  422.                 JSONObject jsonRes;
  423.                 try {
  424.                     jsonRes = new JSONObject(data);
  425.                     // error_code 状态码: 0 支付成功, -1 支付取消, 1 支付失败, -2 支付进行中,
  426.                     // 4010201和4009911 登录状态已失效,引导用户重新登录
  427.                     // error_msg 状态描述
  428.                     int errorCode = jsonRes.optInt("error_code");
  429.                     isCallbackParseOk = true;
  430.                     switch (errorCode) {
  431.                     case 0:
  432.                         Log.d(TAG, "支付结果回调成功");
  433.                         
  434.                         break;
  435.                     case 1:
  436.                         Log.d(TAG, "支付失败");
  437.                         break;
  438.                     case -1:
  439.                         Log.d(TAG, "支付取消");
  440.                         break;
  441.                     case -2:
  442.                         isAccessTokenValid = true;
  443.                         isQTValid = true;
  444.                         // String errorMsg = jsonRes.optString("error_msg");
  445.                         // String text =
  446.                         // appActivity.getString(R.string.pay_callback_toast,
  447.                         // errorCode, errorMsg);
  448.                         // Toast.makeText(appActivity, text,
  449.                         // Toast.LENGTH_SHORT).show();
  450.                         break;
  451.                     case 4010201:
  452.                         // acess_token失效
  453.                         isAccessTokenValid = false;
  454.                         // Toast.makeText(appActivity,
  455.                         // R.string.access_token_invalid,
  456.                         // Toast.LENGTH_SHORT).show();
  457.                         break;
  458.                     case 4009911:
  459.                         // QT失效
  460.                         isQTValid = false;
  461.                         // Toast.makeText(appActivity, R.string.qt_invalid,
  462.                         // Toast.LENGTH_SHORT).show();
  463.                         break;
  464.                     default:
  465.                         break;
  466.                     }
  467.                 } catch (JSONException e) {
  468.                     e.printStackTrace();
  469.                 }

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

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

  506.     private void logout() {
  507.         Intent intent = getLogoutIntent();
  508.         Matrix.execute(appActivity, intent, new IDispatcherCallback() {
  509.             @Override
  510.             public void onFinished(String data) {
  511.                 Log.d(TAG, "logout_success");
  512.                 // Toast.makeText(appActivity, data, Toast.LENGTH_SHORT).show();
  513.                 // System.out.println(data);
  514.             }
  515.         });
  516.     }

  517.     private Intent getLogoutIntent() {
  518.         /*
  519.          * 必须参数: function_code : 必须参数,表示调用SDK接口执行的功能
  520.          */
  521.         Intent intent = new Intent();
  522.         intent.putExtra(ProtocolKeys.FUNCTION_CODE,
  523.                 ProtocolConfigs.FUNC_CODE_LOGOUT);
  524.         return intent;
  525.     }
  526.     
  527.     private void exit() {
  528.         Bundle bundle = new Bundle();

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

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

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

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

  539.         Matrix.invokeActivity(appActivity, intent, mQuitCallback);
  540.     }
  541.     
  542.     // 退出的回调
  543.         private IDispatcherCallback mQuitCallback = new IDispatcherCallback() {

  544.             @Override
  545.             public void onFinished(String data) {
  546.                 // TypeSDKLogger.d( "mQuitCallback, data is " + data);
  547.                 JSONObject json;
  548.                 try {
  549.                     json = new JSONObject(data);
  550.                     int which = json.optInt("which", -1);
  551.                     // String label = json.optString("label");
  552.                     // Toast.makeText(appActivity,
  553.                     // "按钮标识:" + which + ",按钮描述:" + label, Toast.LENGTH_LONG)
  554.                     // .show();
  555.                     switch (which) {
  556.                     case 0: // 用户关闭退出界面
  557.                         Log.d(TAG, "用户关闭退出界面");
  558.                         return;
  559.                     case 1: //进入论坛
  560.                         Log.d(TAG, "exit_success");
  561.                         System.exit(0);
  562.                         break;
  563.                     case 2://退出游戏
  564.                         Log.d(TAG, "exit_success");
  565.                         System.exit(0);
  566.                         break;
  567.                     default:
  568.                         Log.d(TAG, "exit which:" + which);
  569.                         return;
  570.                     }
  571.                 } catch (Exception e) {
  572.                     e.printStackTrace();
  573.                 }
  574.             }

  575.         };
  576.     
  577.     private boolean isCancelLogin(String data) {
  578.         try {
  579.             JSONObject joData = new JSONObject(data);
  580.             int errno = joData.optInt("errno", -1);
  581.             if (-1 == errno) {
  582.                 // Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
  583.                 return true;
  584.             }
  585.         } catch (Exception e) {
  586.         }
  587.         return false;
  588.     }
  589.     
  590.     private String parseAccessTokenFromLoginResult(String loginRes) {
  591.         try {

  592.             JSONObject joRes = new JSONObject(loginRes);
  593.             JSONObject joData = joRes.getJSONObject("data");
  594.             return joData.getString("access_token");
  595.         } catch (Exception e) {
  596.             e.printStackTrace();
  597.         }
  598.         return null;
  599.     }

  600. }

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

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


名字输入:QihooPayInfo

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


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


代码:

点击(此处)折叠或打开

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  36.     public String[] getPayTypes() {
  37.         return payTypes;
  38.     }

  39.     public void setPayTypes(String[] payTypes) {
  40.         this.payTypes = payTypes;
  41.     }
  42.     public String getAccessToken() {
  43.         return accessToken;
  44.     }

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

  48.     public String getQihooUserId() {
  49.         return qihooUserId;
  50.     }

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

  54.     public String getAppKey() {
  55.         return appKey;
  56.     }

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

  60.     public String getPrivateKey() {
  61.         return privateKey;
  62.     }

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

  66.     public String getMoneyAmount() {
  67.         return moneyAmount;
  68.     }

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

  72.     public String getAppName() {
  73.         return appName;
  74.     }

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

  78.     public String getAppUserName() {
  79.         return appUserName;
  80.     }

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

  84.     public String getAppUserId() {
  85.         return appUserId;
  86.     }

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

  90.     public String getProductName() {
  91.         return productName;
  92.     }

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

  96.     public String getProductId() {
  97.         return productId;
  98.     }

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

  102.     public String getNotifyUri() {
  103.         return notifyUri;
  104.     }

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

  108.     public String getExchangeRate() {
  109.         return exchangeRate;
  110.     }

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

  114.     public String getAppExt1() {
  115.         return appExt1;
  116.     }

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

  120.     public String getAppExt2() {
  121.         return appExt2;
  122.     }

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

  126.     public String getAppOrderId() {
  127.         return appOrderId;
  128.     }

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

至此我们就把所有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 01-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运行定额支付流程;

        *金额数为0360SDK运行不定额支付流程。

        * @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 运行定额支

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

       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 01-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


阅读(1520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~