更新日期:2024-05-29海外版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:5.2.1'//google内购 implementation 'androidx.appcompat:appcompat:1.1.0' implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.10" //以下为选接库 implementation 'com.google.android.gms:play-services-auth:19.0.0' //谷歌登录 implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1' // adid获取 implementation 'com.facebook.android:facebook-android-sdk:13.0.0' //Facebook implementation 'com.appsflyer:af-android-sdk:6.5.3' //appsflyer implementation 'com.adjust.sdk:adjust-android:4.28.9' //adjust implementation 'com.android.installreferrer:installreferrer:2.2' //appsflyer、adjust需要 implementation 'com.twitter.sdk.android:twitter:3.1.1'//Twitter登录 implementation (name: 'line_sdk_4.0.8',ext: 'aar')//Line登录 implementation files('libs/libTapDB-3.3.0.aar') //tapdb implementation files('libs/TalkingData_GP_GameAnalytics_V4.0.69.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.setRoleName("角色名称"); roleInfo.setRoleLevel("角色等级"); roleInfo.setServerName("服务器名称"); roleInfo.setVipLevel("vip等级"); 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);
//链接分享(SDK提供界面,分享链接配置在SDK后台的fb活动中) public void callFacebookSharePost(Activity activity,String serverId,String roleId) //链接分享 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,Mapparameters) 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 MapeventData) 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