更新日期:2025-03-18海外版Android接入文档
注意:Facebook SDK 升级到v13.0.0版本,需要配置facebook_client_token参数
在AndroidManifest文件中添加:
在res/values/strings.xml中添加:
replace your client token
facebook_client_token的值在facebook后台:设置(Settings) --> 高级(Advanced) --> 安全(Security) --> 客户端口令(Client token)中获取:

1.1.开发工具:Android Studio
classpath 'com.android.tools.build:gradle:3.3.3'
因Android 11新特性需要,android gradle插件需要升级至对应版本的最新版本

1.3.gradle.properties配置AndroidX
android.useAndroidX=true android.enableJetifier=true
1.4.minSdkVersion 版本最低为16,targetSdkVersion根据Google Play的要求设置
repositories {
flatDir {
dirs 'libs' // aar文件目录
}
}
dependencies {
//以下为必需依赖的库
implementation(name: 'quickgame_hw_x.x.x', ext: 'aar') //x.x.x为具体版本
implementation 'com.android.billingclient:billing:7.0.0'//google内购
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.10"
//以下为选接库,x.x.x为具体版本,以SDK资源里的对接文档为准
implementation 'com.google.android.gms:play-services-auth:x.x.x' //谷歌登录
implementation 'com.google.android.gms:play-services-ads-identifier:x.x.x' // adid获取
implementation 'com.facebook.android:facebook-android-sdk:x.x.x' //Facebook
implementation 'com.appsflyer:af-android-sdk:x.x.x' //appsflyer
implementation 'com.adjust.sdk:adjust-android:x.x.x' //adjust
implementation 'com.android.installreferrer:installreferrer:x.x.x' //appsflyer、adjust需要
implementation 'com.twitter.sdk.android:twitter:x.x.x'//Twitter登录
implementation (name: 'line_sdk_x.x.x',ext: 'aar')//Line登录
implementation files('libs/libTapDB-x.x.x.aar') //tapdb
implementation files('libs/TalkingData_GP_GameAnalytics_Vx.x.x.jar') //TalkingData
}
在application节点下配置
谷歌登录配置(按需配置)
<
meta-data
android:name="google-signin-client_id"
android:value="替换为google后台申请的clientid"/>
注:Google后台有android client 和 web client 两种,这里使用的是web client id,需跟运营人员确认清楚
AppsFlyer配置(按需配置)
<
meta-data
android:name="DEV_KEY"
android:value="替换为在AppsFlyer后台申请的Dev_Key" />
Adjust配置(按需配置)
<
meta-data
android:name="adjust.Token"
android:value="替换成adjust_token"/>
<
meta-data
android:name="adjust.Debug"
android:value="1:沙盒;0:正式"/>
<
meta-data
android:name="adj_login_token"
android:value="替换成登录事件的token" />
<
meta-data
android:name="adj_complete_registration_token"
android:value="替换成注册事件的token" />
<
meta-data
android:name="adj_purchase_token"
android:value="替换成google内购事件的token" />
Facebook配置(按需配置)
TalkingData配置(按需配置)
游戏的Application继承com.quickgame.android.sdk.QuickSdkApplication
<
meta-data
android:name="TD_AppID"
android:value="替换成TD_appid"/>
TapDB配置(按需配置)
<
meta-data
android:name="tapdb_appid"
android:value="替换成tapdb_appid"/>
<
meta-data
android:name="tapdb_channel"
android:value="替换成app当前渠道名"/>
Twitter配置(按需配置)
<
meta-data
android:name="TWITTER_KEY"
android:value="替换成Twitter的API key"/>
<
meta-data
android:name="TWITTER_SECRET"
android:value="替换成Twitter的API secret key"/>
Line登录配置(按需配置)

QuickGameManager sdkInstance = QuickGameManager.getInstance();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sdkInstance.onCreate(this);
}
@Override
protected void onStart() {
super.onStart();
sdkInstance.onStart(this);
}
@Override
protected void onResume() {
super.onResume();
sdkInstance.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
sdkInstance.onPause(this);
}
@Override
protected void onStop() {
super.onStop();
sdkInstance.onStop(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
sdkInstance.onDestroy(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
sdkInstance.onActivityResult(requestCode,resultCode,data);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
sdkInstance.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
调用方法:
public void init(Activity activity,String productCode,QuickGameManager.SDKCallback sdkCallback)
productCode 是在Quick后台创建的应用的ProductCode
sdkInstance.init(this, "quick后台创建产品的ProdectCode", new QuickGameManager.SDKCallback() {
@Override
public void onInitFinished(boolean isSuccess,String error){
if (isSuccess) {
//初始化成功
} else {
Toast.makeText(GameActivity.this, "初始化失败", Toast.LENGTH_LONG).show();
}
}
@Override
public void onLoginFinished(QGUserData userInfo, QGUserHolder loginState) {
//登录成功
if (loginState.getStateCode() == QGUserHolder.LOGIN_SUCCESS) {
String uid = userInfo.getUid(); //作为唯一标示
String token = userInfo.getToken();
//判断登录方式: 6:Facebook,8:Google,9:Naver,10:Twitter,11:Line,12:迁移码,14:VK
String logintype = userInfo.getOpenType();
boolean isGuest = userInfo.isGuest(); //判断是否为游客
} else if (loginState.getStateCode() == QGUserHolder.LOGIN_CANCEL) {
Toast.makeText(GameActivity.this, "登录取消", Toast.LENGTH_LONG).show();
} else if (loginState.getStateCode() == QGUserHolder.LOGIN_FAILED) {
Toast.makeText(GameActivity.this, "登录失败", Toast.LENGTH_LONG).show();
}
}
@Override
public void onLogout() {
//注销账号成功,注销账号成功后,游戏应从游戏的界面退回到登录界面中
}
@Override
public void onGooglePlaySub(String productId, String sdkOrder, boolean isAutoRenewing, boolean isAcknowledged) {
//游戏内没有Google订阅类商品可忽略该回调
Log.d("", "商品id=" + productId + "&&sdkOrder=" + sdkOrder + "&&是否自动续订=" + isAutoRenewing + "&&是否确认" + isAcknowledged);
}
});
调用方法:
public void login(Activity activity)
示例:
sdkInstance.login(this);
如需要显示悬浮窗可以在登录状态下调用,同时sdk后台要打开截图的配置
//显示悬浮窗 public void showFloatView(Activity activity) //关闭悬浮窗 public void closeFloatView(Activity activity)
调用方法:
public void logout(Activity activity)
示例:
sdkInstance.logout(this);
调用方法:
public void pay(Activity activity,QGOrderInfo orderInfo,QGRoleInfo roleInfo,QGPaymentCallback paymentCallback);
orderInfo 是订单信息
orderInfo.setGoodsId() 传入的商品id是Google Play后台配置商品id
QGOrderInfo 方法说明
方法
必填
说明
setProductOrderId
是
游戏生成的订单唯一标识
setGoodsId
是
sdk后台以及Google Play后台配置的商品ID
setOrderSubject
是
商品名称
setAmount
是
商品金额;该参数只用于三方统计,不用于支付
setSuggestCurrency
是
金额货币单位代码,需和金额对应
https://en.wikipedia.org/wiki/ISO_4217#Active_codes
setExtrasParams
否
透传参数,请勿传特殊符号,如无法避免建议进行base64编码
setSkuType
否
商品类型,默认(inapp)是消耗性,订阅请设置为subs
setCallbackURL
否
支付回调地址,可以配置在SDK后台
同时配置时,优先读取后台配置的回调地址
QGRoleInfo 方法说明
方法
必填
说明
setRoleName
是
游戏内角色的名称
setRoleLevel
是
游戏内角色的等级
setServerName
是
游戏内角色区服名称
setRoleId
是
游戏内角色ID
setServerId
是
游戏内角色的区服ID
QGOrderInfo orderInfo = new QGOrderInfo();
orderInfo.setOrderSubject("商品名称");
orderInfo.setProductOrderId("游戏生成的唯一订单号");
orderInfo.setExtrasParams("透传参数");
//透传参数请勿传特殊符号,如果无法避免建议进行base64编码
orderInfo.setGoodsId("商品ID");
//需要和SDK后台配置的商品id对应
orderInfo.setAmount(10.99);
//商品金额,需要和下方的货币单位对应,用于appsflyer等数据SDK统计
orderInfo.setSuggestCurrency("USD");
//USD为美元的货币单位,用于appsflyer等数据SDK统计,以游戏实际货币单位为准
//货币单位参考链接:https://en.wikipedia.org/wiki/ISO_4217#Active_codes
orderInfo.setSkuType("inapp");
// 默认inapp消耗性,订阅请设置为subs
orderInfo.setCallbackURL("callbackUrl");
//支付回调地址,可选参数,可以配置在SDK后台;优先读取后台配置的回调地址
QGRoleInfo roleInfo = new QGRoleInfo();
roleInfo.setRoleId("角色ID");
roleInfo.setServerId("服务器ID");
roleInfo.setRoleName("角色名称");
roleInfo.setRoleLevel("角色等级");
roleInfo.setServerName("服务器名称");
sdkInstance.pay(this, orderInfo, roleInfo, new QuickGameManager.QGPaymentCallback() {
@Override
public void onPaySuccess(String orderId, String orderNo, String goodsId, String extrasParams) {
//返回支付时传入的游戏订单号、SDK订单号、商品ID和透传参数
}
@Override
public void onPayFailed(String orderId, String orderNo,String errorMessage) {
//返回支付时传入的游戏订单号、SDK订单号和错误信息
}
@Override
public void onPayCancel(String orderId, String orderNo,String errorMessage) {
//返回支付时传入的游戏订单号、SDK订单号和错误信息
}
});
public void submitRoleInfo(QGRoleInfo roleInfo) //此为SDK角色信息接口
roleInfo 角色信息
QGRoleInfo roleInfo = new QGRoleInfo();
roleInfo.setRoleId("角色ID");
roleInfo.setRoleName("角色名称");
roleInfo.setRoleLevel("角色等级");
roleInfo.setServerId("服务器ID");
roleInfo.setServerName("服务器名称");
roleInfo.setVipLevel("vip等级");
sdkInstance.submitRoleInfo(roleInfo);
若未绑定指定平台的用户,调用会走绑定流程;若已经绑定用户,调用该方法则为解绑账。接收绑定结果需要设置绑定回调setUserBindCallback,具体见下方示例代码
public void bindUser(String loginOpenType)
loginOpenType 表示要绑定或解绑的平台,值如下表
|
loginOpenType |
对应绑定的登录方式 |
|
QGConstant.LOGIN_OPEN_TYPE_GOOGLE |
Google+登录 |
|
QGConstant.LOGIN_OPEN_TYPE_FACEBOOK |
Fackbook登录 |
|
QGConstant.LOGIN_OPEN_TYPE_NAVER |
Naver登录 |
|
QGConstant.LOGIN_OPEN_TYPE_TWITTER |
Twitter登录 |
|
QGConstant.LOGIN_OPEN_TYPE_LINE |
Line登录 |
|
QGConstant.LOGIN_OPEN_TYPE_PLAYGAME |
Play游戏登录 |
|
QGConstant.LOGIN_OPEN_TYPE_EMAIL |
Email登录 |
|
QGConstant.LOGIN_OPEN_TYPE_VK |
VK登录 |
QuickGameManager.getInstance().setUserBindCallback(new QuickGameManager.QGUserBindCallback() {
@Override
public void onBindInfoChanged(String uid, boolean isBindUnBindSuccess,QGUserBindInfo qgUserBindInfo) {
//isBindUnBindSuccess :绑定或者解绑是否成功
if (qgUserBindInfo.isBindFacebook()) {
Log.d("mainActivity", "绑定facebook");
} else {
Log.d("GameActivity", "解绑facebook");
}
}
@Override
public void onexitUserCenter() {
Log.e("GameActivity", "退出用户中心");
}
});
QuickGameManager.getInstance().bindUser(QGConstant.LOGIN_OPEN_TYPE_FACEBOOK);
//链接分享 public void facebookSharePost(Activity activity, String url, FacebookCallbackmShareCallback) //图片分享 public void facebookShareBitmap(Activity activity, Bitmap bitmap, FacebookCallback mShareCallback)
activity 当前activity
//SDK内部已经记录的事件(无需再处理)
完成注册 标准事件,事件名: fb_mobile_complete_registration,
//完成教程,自定义事件,事件名: Complete Tutorial
public void logCompleteTutorialEvent(boolean success)
true:完成新手指导,false:未完成
//完成创角,自定义事件,事件名:Create Role
public void logCreateRoleEvent(String uid, String name)
uid:用户uid ,name:角色名
//角色升级,自定义事件,事件名: Achieve Level
public void logAchieveLevelEvent (String level)
level:角色等级
//成就解锁, 标准事件,事件名:fb_mobile_achievement_unlocked
public void logUnlockedAchievementEvent (String description, String contentType)
description:成就描述,如“击杀100人头”
contentType:成就类型
//发起结账,标准事件,事件名:fb_mobile_initiated_checkout
public void logInitiateCheckoutEvent (String contentData, String contentId, String contentType, int numItems, boolean paymentInfoAvailable, String currency, double totalPrice)
contentData:商品描述
contentId:商品ID,付费点
contentType:商品类型
numItems:购买商品数量
currency:货币名称,如“USD”
totalPrice:总价
//购买事件,自定义事件,事件名: Purchase
public void logPurchaseEvent(String contentId,String contentType,double valToSum)
contentId:商品ID,付费点
contentType:单位,如“USD”
valToSum:商品价格
//购买完成,标准事件,事件名:fb_mobile_purchase
public void logFbPurchase(double purchaseAmount, String currency, Bundle parameters)
purchaseAmount:购买金额
currency:货币单位,如"USD"
parameters:附加信息,可为null
注意:该方法仅在关闭fb自动记录事件时 或 统计第三方支付(非Google内购)时调用,否则会造成fb的标准购买事件重复统计
//游戏根据自己需要,自定义的事件
public void logEvent(String eventName)
public void logEvent(String eventName, Bundle parameters)
public void logEvent(String eventName,double valueToSum)
public void logEvent(String eventName,double valueToSum,Bundle parameters)
//普通事件上报
public void trackAdjustEvent(String eventToken)
eventToken:事件token,由adjust后台申请得到
//支付事件上报
public void trackAdjustEvent(String eventToken, String orderId, double amount, String currency)
eventToken:支付事件token,由adjust后台申请得到
orderId:订单编号
amount:支付金额
currency:支付货币类型
支付事件的调用时机:
1. 谷歌内购的上报
不配置sdk内的google内购事件token时,可以在sdk支付接口的支付成功回调中上报
2. 第三方支付的上报
支付成功后,sdk服务器通知游戏服务器的CallbackUrl,游戏服务器通过参数中的paytype判断是否是第三方支付,然后通知游戏调用该接口(paytype值不等于8或30 就为第三方支付)
// SDK内部已经投递的事件(无需再处理)
1. 完成注册事件:AFInAppEventType.COMPLETE_REGISTRATION(af_complete_registration)
2. 登陆事件:AFInAppEventType.LOGIN (af_login)
3. google内购支付事件:AFInAppEventType.PURCHASE (af_purchase)
支付事件中的金额和货币单位是从支付接口的orderInfo读取的
//完成教程事件投递接口,对应AF事件名:af_tutorial_completion
public void completeTutorial(boolean success)
//自定义事件
public void appsFlyerEvent(String eventName,Map parameters)
eventName: 事件名
parameters: 事件参数
//第三方支付上报(非google内购)
//支付成功后,sdk服务器通知游戏服务器的CallbackUrl,游戏服务器通过参数中的paytype判断是否是第三方支付,然后通知游戏调用该接口(paytype值不等于8或30 就为第三方支付)
Map eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.ORDER_ID, "123123132"); //订单号,string
eventValues.put(AFInAppEventParameterName.REVENUE, 1.99); //价格,float
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "60_Gems"); //商品名,string
eventValues.put(AFInAppEventParameterName.CONTENT_ID, "123123"); //商品id,string
eventValues.put(AFInAppEventParameterName.CURRENCY, "USD"); //货币单位,string
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValues);
//基本信息投递,一般发生在登录完成,角色信息有所改变之后
public void tdTrackBasicInfo(QGRoleInfo roleInfo, String uid, String userName, String accountType)
//发起支付请求时,记录当前订单
public void tdTrackPayRequest(String orderId,String iapId, double currencyAmount,String currencyType, double virtualCurrencyAmount, String paymentType)
orderId 订单ID,最多64个字符。用于唯一标识一次交易
iapId 商品ID,最多 32 个字符
currencyAmount 支付金额
currencyType 国际货币单位,如:USD
virtualCurrencyAmount 虚拟币金额
paymentType 支付的途径。例如:“google支付”
//支付成功之后,记录订单
public void tdTrackPaySuccess(String orderId)
//自定义事件
public void tdTrackCustomEvent(String eventId, final Map eventData)
eventId 自定义事件名称,最多支持 32 个字符
eventData key为自定义事件的参数名
//第三方支付成功上报 //支付成功后,sdk服务器通知游戏服务器的CallbackUrl,游戏服务器通过参数中的paytype判断是否是第三方支付,然后通知游戏调用该接口(paytype值不等于8或30 就为第三方支付) public void tapDBPaySuccess(String orderId, String product, long amount, String currencyType, String payment) orderId 可为空,长度大于0并小于等于256。订单ID。传递订单ID可进行排重,防止计算多次 product 可为空,长度大于0并小于等于256。商品名称 amount 不可为空,大于0并小于等于100000000000。充值金额。单位分,即无论什么币种,都需要乘以100 currencyType 可为空,货币类型。国际通行三字母表示法,为空时默认CNY。参考:人民币 CNY,美元 USD;欧元 EUR payment 可为空,长度大于0并小于等于256。充值渠道
public void shareToTwitter(Activity activity,String text,String url) activity 当前activity text 分享文本 url 分享链接
//日志开关接口
QGLog.setDebugMod(boolean isShow) //在初始化init之后调用
//登录成功后调用,获取第三方登录绑定情况
public QGUserBindInfo getUserBindInfo()
//直接游客模式登录,不显示登录框
public void freeLogin(Activity activity)
//获取用户信息
public QGUserData getUser()
// 进入用户中心
public void enterUserCenter(Activity activity)
//获取设备号
public String getDeviceId(Activity activity)
<
meta-data
android:name="noFloatViewBinding"
android:value="1" />
1:打开 0:关闭
<
meta-data
android:name="showLoginLogo"
android:value="true"/>
<
meta-data
android:name="channelId"
android:value="c1" />
<
meta-data
android:name="isNeedVerify"
android:value="true" />
public void queryGoogleSku(ListgoodsIds, QueryGoogleSkuListener listener)
goodsIds 商品列表
ListgoodsIds = new ArrayList<>(); goodsIds.add("1"); goodsIds.add("2"); sdkInstance.queryGoogleSku(goodsIds, new QueryGoogleSkuListener() { @Override public void onResult(List skuDetailsList) { for (SkuDetails sku : skuDetailsList) { } } });
public void setGooglePreRegisterListener(GooglePreRegisterListener preRegisterListener)
示例
sdkInstance.setGooglePreRegisterListener(new GooglePreRegisterListener() {
@Override
public void onCheckSuccess() {
}
});
sdk默认支持http明文传输,如果需要移除http明文传输支持
在主module的res/xml目录下创建network_security_config.xml文件,内容如下
注意:文件名必须为network_security_config.xml
用户协议和隐私政策默认显示在邮箱账户注册界面(显示内容在SDK后台-> 游戏管理 --> 应用扩展 里进行配置)
如果需要在首次启动或者登录界面进行显示,可在初始化接口前设置SDKConfig:
SDKConfig sdkConfig = new SDKConfig.Builder()
//首次启动显示用户协议弹框,不同意无法进入登录界面
.showServicesAndPrivacyPolicy()
//在登录界面显示用户协议
.showLoginServicesAndPrivacyPolicy()
.build();
QuickGameManager.getInstance().setSdkConfig(sdkConfig);
李先生:13880511661
QQ:48157910
赵先生:15390049857
QQ:1077535763
孙女士:13551010407
QQ:1799614139
QQ群:698731538