Commit 12a4c3bb0df96a3232bef95df747fc73a739ec0b
1 parent
442078de6e
Exists in
master
升级google5.0支付
Showing 1 changed file with 4 additions and 3 deletions Inline Diff
README.md
1 | # Gump SDK 4 for Android接入文档 | 1 | # Gump SDK 4 for Android接入文档 |
2 | 2 | ||
3 | V4.9.1 | 3 | V4.9.5 |
4 | 2021年07月29日 | 4 | 2022年09月08日 |
5 | 5 | ||
6 | 6 | ||
7 | ## 版本概述 | 7 | ## 版本概述 |
8 | 8 | ||
9 | 此版本为使用AndroidStudio开发的版本,使用aar的方式提供sdk接入包,并使用gradle在线依赖方式,aar内别不包含依赖包,请按此文档描述接入. | 9 | 此版本为使用AndroidStudio开发的版本,使用aar的方式提供sdk接入包,并使用gradle在线依赖方式,aar内别不包含依赖包,请按此文档描述接入. |
10 | 10 | ||
11 | 此SDK适用android4.0以上系统. | 11 | 此SDK适用android4.0以上系统. |
12 | 12 | ||
13 | ## 第一章 接入指南 | 13 | ## 第一章 接入指南 |
14 | ### 1.依赖导入 | 14 | ### 1.依赖导入 |
15 | 配置gradle,以下为必须项 | 15 | 配置gradle,以下为必须项 |
16 | 16 | ||
17 | ```groovy | 17 | ```groovy |
18 | repositories{ | 18 | repositories{ |
19 | maven{ | 19 | maven{ |
20 | url "http://117.50.8.198:8081/nexus/content/repositories/sdk" | 20 | url "http://117.50.8.198:8081/nexus/content/repositories/sdk" |
21 | } | 21 | } |
22 | } | 22 | } |
23 | dependencies { | 23 | dependencies { |
24 | implementation 'com.gumptech.sdk:GameSDK:4.9.1' | 24 | implementation 'com.gumptech.sdk:GameSDK:4.9.5' |
25 | 25 | ||
26 | } | 26 | } |
27 | ``` | 27 | ``` |
28 | 28 | ||
29 | 29 | ||
30 | ### 2.修改AndroidManifest.xml文件 | 30 | ### 2.修改AndroidManifest.xml文件 |
31 | 首先添加必要的权限,如下所示: | 31 | 首先添加必要的权限,如下所示: |
32 | 32 | ||
33 | ```xml | 33 | ```xml |
34 | <uses-permission android:name="android.permission.INTERNET" /> | 34 | <uses-permission android:name="android.permission.INTERNET" /> |
35 | <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | 35 | <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> |
36 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | 36 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> |
37 | <uses-permission android:name="com.google.android.gms.permission.AD_ID"/> | ||
37 | ``` | 38 | ``` |
38 | 39 | ||
39 | 其次注册相应的Activity,具体如下: | 40 | 其次注册相应的Activity,具体如下: |
40 | 41 | ||
41 | ```xml | 42 | ```xml |
42 | <activity | 43 | <activity |
43 | android:name="com.gump.game.sdk.PassportActivity" | 44 | android:name="com.gump.game.sdk.PassportActivity" |
44 | android:configChanges="orientation|screenSize|keyboardHidden|keyboard|screenLayout" | 45 | android:configChanges="orientation|screenSize|keyboardHidden|keyboard|screenLayout" |
45 | android:launchMode="singleTask" | 46 | android:launchMode="singleTask" |
46 | android:theme="@style/Theme.Origin" //登录界面的主题,可选项:Theme.Origin\Theme.Orange\Theme.Blue\Theme.Pink | 47 | android:theme="@style/Theme.Origin" //登录界面的主题,可选项:Theme.Origin\Theme.Orange\Theme.Blue\Theme.Pink |
47 | android:screenOrientation="behind" | 48 | android:screenOrientation="behind" |
48 | android:windowSoftInputMode="stateAlwaysHidden|adjustPan"> | 49 | android:windowSoftInputMode="stateAlwaysHidden|adjustPan"> |
49 | </activity> | 50 | </activity> |
50 | <activity | 51 | <activity |
51 | android:name="com.gump.game.sdk.RechargeActivity" | 52 | android:name="com.gump.game.sdk.RechargeActivity" |
52 | android:configChanges="orientation|screenSize|keyboardHidden|keyboard|screenLayout" | 53 | android:configChanges="orientation|screenSize|keyboardHidden|keyboard|screenLayout" |
53 | android:launchMode="singleTask" | 54 | android:launchMode="singleTask" |
54 | android:screenOrientation="behind" | 55 | android:screenOrientation="behind" |
55 | android:theme="@style/Theme.Translucent" > | 56 | android:theme="@style/Theme.Translucent" > |
56 | <intent-filter> | 57 | <intent-filter> |
57 | <category android:name="android.intent.category.DEFAULT" /> | 58 | <category android:name="android.intent.category.DEFAULT" /> |
58 | <action android:name="android.intent.action.VIEW" /> | 59 | <action android:name="android.intent.action.VIEW" /> |
59 | <category android:name="android.intent.category.BROWSABLE" /> | 60 | <category android:name="android.intent.category.BROWSABLE" /> |
60 | <data | 61 | <data |
61 | android:host="com.gump.sdk" | 62 | android:host="com.gump.sdk" |
62 | android:scheme="gump+游戏的appId" /> | 63 | android:scheme="gump+游戏的appId" /> |
63 | </intent-filter> | 64 | </intent-filter> |
64 | </activity> | 65 | </activity> |
65 | ``` | 66 | ``` |
66 | 67 | ||
67 | ### 3.向Gump平台索要游戏ID(AppID),完成代码接入 | 68 | ### 3.向Gump平台索要游戏ID(AppID),完成代码接入 |
68 | 正式开始接入逻辑代码前,先介绍下一些附加设置,以方便代码接入 | 69 | 正式开始接入逻辑代码前,先介绍下一些附加设置,以方便代码接入 |
69 | 70 | ||
70 | *是否打印debug日志 | 71 | *是否打印debug日志 |
71 | 72 | ||
72 | ```java | 73 | ```java |
73 | GameSDK.getSettings().enableDebugLogging(true); | 74 | GameSDK.getSettings().enableDebugLogging(true); |
74 | ``` | 75 | ``` |
75 | 76 | ||
76 | *设置需要启用的第三方登录,参数可选类型见第二章:[第三方登录平台](http://repository.gumptech.com:81/document/gamesdk4-android/blob/master/IntegrationGuide.md#1-third_plat) 字段说明 | 77 | *设置需要启用的第三方登录,参数可选类型见第二章:[第三方登录平台](http://repository.gumptech.com:81/document/gamesdk4-android/blob/master/IntegrationGuide.md#1-third_plat) 字段说明 |
77 | 78 | ||
78 | ```java | 79 | ```java |
79 | GameSDK.getSettings().requestThirdSupport(SDKSettings.THIRD_SUPPORT_*); | 80 | GameSDK.getSettings().requestThirdSupport(SDKSettings.THIRD_SUPPORT_*); |
80 | ``` | 81 | ``` |
81 | 82 | ||
82 | 83 | ||
83 | #### 1.调用GameSDK前需要执行初始化。 | 84 | #### 1.调用GameSDK前需要执行初始化。 |
84 | 85 | ||
85 | 若不需要分渠道 | 86 | 若不需要分渠道 |
86 | 87 | ||
87 | ```java | 88 | ```java |
88 | GameSDK.init(Context,Appid); | 89 | GameSDK.init(Context,Appid); |
89 | ``` | 90 | ``` |
90 | 如果需要定义渠道,必须使用如下方法 | 91 | 如果需要定义渠道,必须使用如下方法 |
91 | 92 | ||
92 | ```java | 93 | ```java |
93 | GameSDK.init(Context,Appid,ChannelId); | 94 | GameSDK.init(Context,Appid,ChannelId); |
94 | ``` | 95 | ``` |
95 | 96 | ||
96 | 97 | ||
97 | #### 2.调用GameSDK的登录方法,将执行登录流程,需要一个Activity实例作参数 | 98 | #### 2.调用GameSDK的登录方法,将执行登录流程,需要一个Activity实例作参数 |
98 | 99 | ||
99 | ```java | 100 | ```java |
100 | GameSDK.login(Activity); | 101 | GameSDK.login(Activity); |
101 | ``` | 102 | ``` |
102 | 在此之前,开发者需要注册用户状态监听以接受用户的登录/登出通知,通常如下: | 103 | 在此之前,开发者需要注册用户状态监听以接受用户的登录/登出通知,通常如下: |
103 | 104 | ||
104 | ```java | 105 | ```java |
105 | GameSDK.setUserStateListener(new LoginStateListener() { | 106 | GameSDK.setUserStateListener(new LoginStateListener() { |
106 | 107 | ||
107 | @Override | 108 | @Override |
108 | public void onCreateUser() { | 109 | public void onCreateUser() { |
109 | //新用户注册,用于事件打点。勿阻塞此方法,否则影响登录流程 | 110 | //新用户注册,用于事件打点。勿阻塞此方法,否则影响登录流程 |
110 | Log.i(TAG,"Someone registers an new Account"); | 111 | Log.i(TAG,"Someone registers an new Account"); |
111 | } | 112 | } |
112 | 113 | ||
113 | @Override | 114 | @Override |
114 | public void onLoginSuccess(GumpUser gumpUser) { | 115 | public void onLoginSuccess(GumpUser gumpUser) { |
115 | //登录成功,用户信息包含在GumpUser对象里 | 116 | //登录成功,用户信息包含在GumpUser对象里 |
116 | } | 117 | } |
117 | 118 | ||
118 | @Override | 119 | @Override |
119 | public void onLoginFailed(int code, String msg) { | 120 | public void onLoginFailed(int code, String msg) { |
120 | //登录出错,根据错误码和信息判断错误类型 | 121 | //登录出错,根据错误码和信息判断错误类型 |
121 | Toast.makeText(MainActivity.this, "Login failed:code="+code+",message="+msg, Toast.LENGTH_SHORT).show(); | 122 | Toast.makeText(MainActivity.this, "Login failed:code="+code+",message="+msg, Toast.LENGTH_SHORT).show(); |
122 | } | 123 | } |
123 | 124 | ||
124 | @Override | 125 | @Override |
125 | public void onLoginCanceled() { | 126 | public void onLoginCanceled() { |
126 | //用户取消登录 | 127 | //用户取消登录 |
127 | Toast.makeText(MainActivity.this, "operate be canceled", Toast.LENGTH_SHORT).show(); | 128 | Toast.makeText(MainActivity.this, "operate be canceled", Toast.LENGTH_SHORT).show(); |
128 | } | 129 | } |
129 | 130 | ||
130 | @Override | 131 | @Override |
131 | public void onLogout() { | 132 | public void onLogout() { |
132 | //用户登出 | 133 | //用户登出 |
133 | 134 | ||
134 | } | 135 | } |
135 | @Override | 136 | @Override |
136 | public void onPermissionDenied(String[] deniedPermissions) { | 137 | public void onPermissionDenied(String[] deniedPermissions) { |
137 | //用户未授予权限,参数为没有获取的权限 | 138 | //用户未授予权限,参数为没有获取的权限 |
138 | } | 139 | } |
139 | }); | 140 | }); |
140 | ``` | 141 | ``` |
141 | 142 | ||
142 | 如上成功登录后收到的GumpUser对象包含以下信息 | 143 | 如上成功登录后收到的GumpUser对象包含以下信息 |
143 | 144 | ||
144 | ```java | 145 | ```java |
145 | gumpUser.getUid();//获取用户的userid,此Id标识唯一用户! | 146 | gumpUser.getUid();//获取用户的userid,此Id标识唯一用户! |
146 | gumpUser.getAccountType();//用户类型,此类型数据可从GumpPreference常量获取 | 147 | gumpUser.getAccountType();//用户类型,此类型数据可从GumpPreference常量获取 |
147 | gumpUser.getSessionKey();//登录的sessionKey对象,获取sessionKey字符串请使用此对象的getToken()方法 | 148 | gumpUser.getSessionKey();//登录的sessionKey对象,获取sessionKey字符串请使用此对象的getToken()方法 |
148 | ``` | 149 | ``` |
149 | 150 | ||
150 | #### 3.支付功能 | 151 | #### 3.支付功能 |
151 | 调用支付前需先判断支付状态,根据状态调用支付方法 | 152 | 调用支付前需先判断支付状态,根据状态调用支付方法 |
152 | 153 | ||
153 | ```java | 154 | ```java |
154 | GameSDK.iapUsable(Activity, serverId, roleId, new ResultCallback() { | 155 | GameSDK.iapUsable(Activity, serverId, roleId, new ResultCallback() { |
155 | @Override | 156 | @Override |
156 | public void onResult(boolean result) { | 157 | public void onResult(boolean result) { |
157 | if(result){ | 158 | if(result){ |
158 | //调用GameSDK.iap | 159 | //调用GameSDK.iap |
159 | }else{ | 160 | }else{ |
160 | //调用GameSDK.pay | 161 | //调用GameSDK.pay |
161 | } | 162 | } |
162 | } | 163 | } |
163 | }); | 164 | }); |
164 | ``` | 165 | ``` |
165 | 166 | ||
166 | 1)调用GameSDK.pay | 167 | 1)调用GameSDK.pay |
167 | 168 | ||
168 | ```java | 169 | ```java |
169 | Bundle payInfo = new Bundle(); | 170 | Bundle payInfo = new Bundle(); |
170 | payInfo.putString("product", "元宝"); | 171 | payInfo.putString("product", "元宝"); |
171 | payInfo.putFloat("amount", 40.0f); | 172 | payInfo.putFloat("amount", 40.0f); |
172 | payInfo.putString("extraInfo", "This is demo!"); | 173 | payInfo.putString("extraInfo", "This is demo!"); |
173 | payInfo.putString("serverId", "B4003"); | 174 | payInfo.putString("serverId", "B4003"); |
174 | payInfo.putString("roleId", "10010"); | 175 | payInfo.putString("roleId", "10010"); |
175 | payInfo.putString("currency","currency"); | 176 | payInfo.putString("currency","currency"); |
176 | GumpSDK.pay(MainActivity.this, payInfo,PurchaseCallback); | 177 | GumpSDK.pay(MainActivity.this, payInfo,PurchaseCallback); |
177 | ``` | 178 | ``` |
178 | 调用pay方法时,必须传入一个bundle对象,包含如上字段,所有字段必须全部包含 | 179 | 调用pay方法时,必须传入一个bundle对象,包含如上字段,所有字段必须全部包含 |
179 | 180 | ||
180 | 181 | ||
181 | 2)IAP支付 | 182 | 2)IAP支付 |
182 | 183 | ||
183 | 184 | ||
184 | ```java | 185 | ```java |
185 | Bundle payInfo = new Bundle(); | 186 | Bundle payInfo = new Bundle(); |
186 | payInfo.putString("product", "gp_skuId"); | 187 | payInfo.putString("product", "gp_skuId"); |
187 | payInfo.putFloat("amount", 0.1f); | 188 | payInfo.putFloat("amount", 0.1f); |
188 | payInfo.putString("extraInfo", "This is demo!"); | 189 | payInfo.putString("extraInfo", "This is demo!"); |
189 | payInfo.putString("serverId", "100"); | 190 | payInfo.putString("serverId", "100"); |
190 | payInfo.putString("roleId","100123"); | 191 | payInfo.putString("roleId","100123"); |
191 | GumpSDK.iap(MainActivity.this, payInfo, PurchaseCallback); | 192 | GumpSDK.iap(MainActivity.this, payInfo, PurchaseCallback); |
192 | ``` | 193 | ``` |
193 | 194 | ||
194 | 3)PurchaseCallback为支付状态回调接口,此接口含有3个方法 | 195 | 3)PurchaseCallback为支付状态回调接口,此接口含有3个方法 |
195 | 196 | ||
196 | ```java | 197 | ```java |
197 | @Override | 198 | @Override |
198 | public void onPurchaseCompleted() { | 199 | public void onPurchaseCompleted() { |
199 | Log.i(TAG,"purchase completed"); | 200 | Log.i(TAG,"purchase completed"); |
200 | } | 201 | } |
201 | 202 | ||
202 | @Override | 203 | @Override |
203 | public void onPurchaseError(int code, String msg) { | 204 | public void onPurchaseError(int code, String msg) { |
204 | Log.i(TAG,"purchase error"); | 205 | Log.i(TAG,"purchase error"); |
205 | } | 206 | } |
206 | 207 | ||
207 | @Override | 208 | @Override |
208 | public void onPurchaseCanceled() { | 209 | public void onPurchaseCanceled() { |
209 | Log.i(TAG,"purchase canceled"); | 210 | Log.i(TAG,"purchase canceled"); |
210 | } | 211 | } |
211 | ``` | 212 | ``` |
212 | 213 | ||
213 | #### 4.注销登录 | 214 | #### 4.注销登录 |
214 | 215 | ||
215 | ```java | 216 | ```java |
216 | GameSDK.logout(Activity); | 217 | GameSDK.logout(Activity); |
217 | ``` | 218 | ``` |
218 | 当此方法调用后,用户退出登录,并会通过LoginStateListener接口通知调用程序!为了便于用户切换登录账户,请在游戏内提供用户注销的触发按钮 | 219 | 当此方法调用后,用户退出登录,并会通过LoginStateListener接口通知调用程序!为了便于用户切换登录账户,请在游戏内提供用户注销的触发按钮 |
219 | #### 5.运营开关接口,若需要接入,会有我方运营人员提出需求,否则不需要接入(若对此接口不知所云,即可认为不需要接入,请自行忽略) | 220 | #### 5.运营开关接口,若需要接入,会有我方运营人员提出需求,否则不需要接入(若对此接口不知所云,即可认为不需要接入,请自行忽略) |
220 | 221 | ||
221 | ```java | 222 | ```java |
222 | GameSDK.inspectRiskLevel(this, new ResultCallback() { | 223 | GameSDK.inspectRiskLevel(this, new ResultCallback() { |
223 | @Override | 224 | @Override |
224 | public void onResult(boolean result) { | 225 | public void onResult(boolean result) { |
225 | Log.i(TAG,result?"There is some risks":"Nothing is risk"); | 226 | Log.i(TAG,result?"There is some risks":"Nothing is risk"); |
226 | } | 227 | } |
227 | }); | 228 | }); |
228 | ``` | 229 | ``` |
229 | 230 | ||
230 | ## 第二章 常量字段与代码 | 231 | ## 第二章 常量字段与代码 |
231 | ### 1.第三方登录平台(third_plat) | 232 | ### 1.第三方登录平台(third_plat) |
232 | | 常量字段 | 说明 | | 233 | | 常量字段 | 说明 | |
233 | |--------------------------------|--------------| | 234 | |--------------------------------|--------------| |
234 | |SDKSettings.THIRD_SUPPORT_FB | Facebook登录 | | 235 | |SDKSettings.THIRD_SUPPORT_FB | Facebook登录 | |
235 | |SDKSettings.THIRD_SUPPORT_GOOGLE| Google登录 | | 236 | |SDKSettings.THIRD_SUPPORT_GOOGLE| Google登录 | |
236 | |SDKSettings.THIRD_SUPPORT_LINE | Line登录 | | 237 | |SDKSettings.THIRD_SUPPORT_LINE | Line登录 | |
237 | 238 | ||
238 | ### 2.登录账户类型 | 239 | ### 2.登录账户类型 |
239 | | 常量字段 | 说明 | | 240 | | 常量字段 | 说明 | |
240 | |-------------------------------------|--------------| | 241 | |-------------------------------------|--------------| |
241 | |GumpPreference.ACCOUNT_TYPE_FB | Facebook用户 | | 242 | |GumpPreference.ACCOUNT_TYPE_FB | Facebook用户 | |
242 | |GumpPreference.ACCOUNT_TYPE_REG | Gump注册用户 | | 243 | |GumpPreference.ACCOUNT_TYPE_REG | Gump注册用户 | |
243 | |GumpPreference.ACCOUNT_TYPE_QUICK_REG| 游客 | | 244 | |GumpPreference.ACCOUNT_TYPE_QUICK_REG| 游客 | |
244 | |GumpPreference.ACCOUNT_TYPE_GOOGLE | Google用户 | | 245 | |GumpPreference.ACCOUNT_TYPE_GOOGLE | Google用户 | |
245 | |GumpPreference.ACCOUNT_TYPE_LINE | Line用户 | | 246 | |GumpPreference.ACCOUNT_TYPE_LINE | Line用户 | |
246 | 247 | ||
247 | 248 | ||
248 | 249 | ||
249 | ## 第三章 常见问题 | 250 | ## 第三章 常见问题 |
250 | ### 问题1: 如何避免混淆对SDK的影响? | 251 | ### 问题1: 如何避免混淆对SDK的影响? |
251 | 解答:有些开发者对接入了SDK的程序进行混淆时,有可能会覆盖某些java | 252 | 解答:有些开发者对接入了SDK的程序进行混淆时,有可能会覆盖某些java |
252 | 类,导致SDK无法正常工作,解决方法如下: | 253 | 类,导致SDK无法正常工作,解决方法如下: |
253 | Ø 请开发者在混淆配置文件proguard.cfg或proguard-project.txt的最后加上 | 254 | Ø 请开发者在混淆配置文件proguard.cfg或proguard-project.txt的最后加上 |
254 | 255 | ||
255 | -keepattributes *Annotation*,InnerClasses,SourceFile,LineNumberTable | 256 | -keepattributes *Annotation*,InnerClasses,SourceFile,LineNumberTable |
256 | -keep public class * extends android.app.Service | 257 | -keep public class * extends android.app.Service |
257 | -keep public class com.google.vending.licensing.ILicensingService | 258 | -keep public class com.google.vending.licensing.ILicensingService |
258 | -keep public class com.android.vending.licensing.ILicensingService | 259 | -keep public class com.android.vending.licensing.ILicensingService |
259 | -keep class com.gump.game.sdk.view.* {*;} | 260 | -keep class com.gump.game.sdk.view.* {*;} |
260 | -keep class com.gump.game.sdk.web.* {*;} | 261 | -keep class com.gump.game.sdk.web.* {*;} |
261 | 262 | ||
262 | 263 | ||
263 | | 264 | |
264 | 使得混淆的时候不会影响SDK的命名空间。 | 265 | 使得混淆的时候不会影响SDK的命名空间。 |