SDK介绍
- 安卓 SDK用于安卓游戏联运,主要提供用户系统、支付系统、游戏攻略、游戏礼包等功能。
- 安卓 SDK接入配置SDK版本,minSdkVersion大于等于16,targetSdkVersion小于等于28。
注意事项
- 接口参数大小写敏感
- request 和 response的编码格式均为 UTF-8
前期准备
1.SDK接入技术人员仔细阅读该对接文档
2.下载SDK-DEMO示例 下载,获取DuoJiaoLib工程
3.CP提供支付回调地址。
4.获取小氪平台配置参数:
字段 | 描述 |
---|---|
DJ_APPID | app_id(游戏ID) |
DJ_APPKEY | app_key(游戏KEY) |
DJ_CLIENTID | client_id(客户端ID) |
DJ_CLIENTKEY | client_key(客户端KEY) |
DJ_AGENT | 渠道标识(SDK默认值) |
DJ_GAMEVERSION | 游戏版本号(以接入的游戏版本为准,格式为三位比如:实际游戏版本为:2.0,则需要输入2.0.0) |
DJ_SDKVERSION | sdk版本号(一般不需要修改) |
DJ_BAIDUID | 百度APPID(如果平台不提供则默认填0) |
DJ_BAIDUKEY | 百度KEY (如果平台不提供则默认填空) |
DJ_AIQIYIID | 爱奇艺APPID (如果平台不提供则默认填空, value值前面必须需要加上:\,否则参数无效 ) |
接入步骤
安卓 SDK导入
SDK自2.0.0版本开始,提供Android Studio版本对接示列.
Android studio方式:
引入SDK平台提供的(qifenglib)工程, (qifenglib是基于Android Sttudio开发)
具体流程如下:
- 选择File->New->Import Module->选择qifenglib导入.
- 注意qifenglib工程中的build.gradle文件中的第三方库引用.
- 将qifenglib的AndroidManifest中(DJ_APPID、DJ_CLIENTID、DJ_CLIENTKEY、DJ_GAMEVERSION、DJ_BAIDUID、DJ_BAIDUKEY、DJ_AIQIYIID)替换为:从本平台获取的数据(DJ_AGENT、DJ_SDKVERSION可以不修改)
qifenglib的AndroidManifest中provider设置的包名需要替换成游戏主包名
- sdk的assets目录下的图片文件《kprogresshud_spinner.png》确保引入,不然会导致微信无法支付.
- sdk的assets目录下《supplierconfig.json》确保引入,不然会导致设备重要标识无法获取.
- 退出接口请务必调用
清单文件application标签下配置android:usesCleartextTraffic="true",如果配置了android:networkSecurityConfig文件 请在networkSecurityConfig文件里面配置如下:
<network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">cmpassport.com</domain> </domain-config> </network-security-config>
请务必依赖v4包com.android.support:support-v4版本高于25.4.0或者v7包com.android.support:appcompat-v7版本高于25.4.0
implementation 'com.android.support:appcompat-v7:27.1.1'
Application生命周期方法必须调用
注意:必须在指定生命周期调用@Override public void onCreate() { super.onCreate(); YTSDKManager.qfInitApplication(this); } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); YTSDKManager.qfAttachBaseContext(this); }
在游戏包的AndroidManifest.xml文件启动页Activity注册中新增intent-filter,用于外部打开游戏。
注意:path必须改为当前游戏包名,其他值保持不变<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="host" android:path="/com.xiaokr.sdk" android:port="8080" android:scheme="qifeng" /> </intent-filter>
百度SDK接入相关配置(如渠道不提供百度配置参数,则建议不接入以下配置)
注意:如果平台提供了DJ_BAIDUID和DJ_BAIDUKEY要求启用百度SDK, 请务必配置manifest的DJ_BAIDUID和DJ_BAIDUKEY在AndroidManifest.xml文件中新增以下配置
注意: 修改XenvProvider的authorities包名为游戏包名,还有permission包名 添加dj_plugin.apk文件放到assets目录,dj_plugin.apk文件下载入口 : 下载(dj_plugin.apk)<!-- 百度配置 --> <permission android:name="com.qifeng.sdkv.permission.xenv.RECEIVE" android:protectionLevel="signatureOrSystem" /> <uses-permission android:name="com.qifeng.sdkv.permission.xenv.RECEIVE" /> <activity android:name="com.baidu.xenv.XenvActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:excludeFromRecents="true" android:exported="false" android:launchMode="standard" android:theme="@android:style/Theme.Translucent"> <intent-filter> <action android:name="com.baidu.action.Xenv.VIEW" /> <category android:name="com.baidu.category.xenv" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <service android:name="com.baidu.xenv.XenvService" android:exported="false"> <intent-filter> <action android:name="com.baidu.action.Xenv.VIEW" /> <category android:name="com.baidu.category.xenv" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <provider android:name="com.baidu.xenv.XenvProvider" android:authorities="com.qifeng.sdkv.xenv.ac.provider" android:exported="false" tools:replace="android:authorities" /> <meta-data android:name="seckey_avscan" android:value="660346260f8a841a04ec2a56815b421b" /> <meta-data android:name="appkey_avscan" android:value="100034" /> <!-- 百度配置 end -->
接口调用
1. DEBUG模式开关
DEBUG日志开关
//设置日志打印 正式上线需要替换成flase
Logger.setLog(true);
2. 权限回调接口
sdk内部会申请相关权限,需要在游戏页面(onRequestPermissionsResult)中回调sdk接口,
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//权限回调 cp必须在这个方法中调用SDK接口。
Logger.msg("授权回调" + requestCode);
YTSDKManager.requestPermissionResult(context,requestCode, permissions, grantResults);
}
3. SDK初始化
ttwsdkmanager = YTSDKManager.getInstance(this,new InitCallback() {
@Override
public void onInitSuccess(String arg0) {
// TODO Auto-generated method stub
//如果需要自动登录请在此处添加登录相关接口
}
@Override
public void onInitFail(String arg0) {
// TODO Auto-generated method stub
}
})
调用初始化之前必须确保:
1.上下文路径必须为Activity实例.
2.AndroidManifest.xml 中的AppID等配置参数为当前游戏参数。
4. SDK登录
ttwsdkmanager.showLogin(this, true, new OnLoginListener() {
@Override
public void loginSuccess(LogincallBack logincallback) {
// TODO Auto-generated method stub111
System.out.println("登录成功");
if(logincallback!=null){
String user_id = logincallback.mem_id;
String user_token = logincallback.user_token;
}
}
@Override
public void loginError(LoginErrorMsg errorMsg) {
// TODO Auto-generated method stub
if (errorMsg != null) {
Toast.makeText(SDKActivity.this, errorMsg.msg,
Toast.LENGTH_SHORT).show();
}
}
});
调用登录必须确保:
1.SDK初始化完成,否则将无法登录。
5. 创建角色
ttwsdkmanager.addUserRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999",
new RolekCallback() {
@Override
public void onSuccess(Object responseString) {
// TODO Auto-generated method stub 正式游戏接入时不需要Toast
Toast.makeText(SDKActivity.this, "创角信息提交成功",
Toast.LENGTH_SHORT).show();
// 接口调用成功 响应结果在这里
}
@Override
public void onFailure(Object failureString) {
// TODO Auto-generated method stub
}
});
为了SDK平台更好的获取有用数据,所以游戏接入时务必接入此接口。
6. 角色升级
ttwsdkmanager.upGradeRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999",
new RolekCallback() {
@Override
public void onSuccess(Object responseString) {
// TODO Auto-generated method stub 正式游戏接入时不需要Toast
// 接口调用成功 响应结果在这里
}
@Override
public void onFailure(Object failureString) {
// TODO Auto-generated method stub
tv_userRole.setClickable(true);
}
});
为了SDK平台更好的获取有用数据,所以游戏接入时务必接入此接口。
7. 游戏购买道具支付
ttwsdkmanager.showPay(this, "角色ID", money, "区服ID", "产品ID","产品名称", "产品详情", "CP订单号","区服名称","角色名称"
new OnPaymentListener() {
@Override
public void paymentSuccess(PaymentCallbackInfo callbackInfo) {
// TODO Auto-generated method stub
Toast.makeText(
getApplication(),
"支付金额数:" + callbackInfo.money + " 消息提示:"
+ callbackInfo.msg, Toast.LENGTH_LONG)
.show();
}
@Override
public void paymentError(PaymentErrorMsg errorMsg) {
// TODO Auto-generated method stub
Toast.makeText(
getApplication(),
"支付失败:code:" + errorMsg.code + " ErrorMsg:"
+ errorMsg.msg + " 预支付的金额:"
+ errorMsg.money, Toast.LENGTH_LONG)
.show();
}
});
调用支付必须确保:
1.SDK的assets目录下必须有(kprogresshud_spinner.png)资源文件,不然将无法调起微信支付。
8. 游戏退出
ttwsdkmanager.doOutAdavert(this, true, new GameOutCallback() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
SDKActivity.this.finish();
}
@Override
public void onFail() {
// TODO Auto-generated method stub
Log.i("点击取消", "取消");
}
});
为了保证游戏正常运行和更好的游戏体验请务必在窗口关闭时手动调用 ttwsdkmanager.recycle();
9.实名认证接口
ttwsdkmanager.showRealName(this, new RealNameCallback() {
@Override
public void onRealSuccess(String arg0) {
// TODO Auto-generated method stub
//返回格式:{"drvId":"身份证号码","age":"年龄"}
Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
}
@Override
public void onRealFail(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
}
});
该接口必须保证用户已经登录,所以建议在登录完成之后的回调中调用。
10.拓展接口
//onCreate方法中调用
YTSDKManager.onCreateSdk(YTSDKActivity.this);
//onWindowFocusChanged方法中调用
YTSDKManager.onWindowFocusChangedSdk(YTSDKActivity.this);
//onResume方法中调用
YTSDKManager.onResumeSdk(YTSDKActivity.this);
//onPause方法中调用
YTSDKManager.onPauseSdk(YTSDKActivity.this);
//onDestroy方法中调用
YTSDKManager.onDestroySdk(YTSDKActivity.this);
以上接口用于拓展需求,用于运营统计游戏数据,如果CP支持回调则必须接入,会影响游戏运营数据
11.切换账号
ttwsdkmanager.switchAccount(YTSDKActivity.this, new OnLoginListener() {
@Override
public void loginSuccess(LogincallBack logincallback) {
// TODO Auto-generated method stub111
ttwsdkmanager.showRealName(YTSDKActivity.this, new RealNameCallback() {
@Override
public void onRealSuccess(String success) {
Logger.msg(success);
Toast.makeText(YTSDKActivity.this, success, Toast.LENGTH_SHORT).show();
}
@Override
public void onRealFail(String fail) {
Logger.msg(fail);
Toast.makeText(YTSDKActivity.this, fail, Toast.LENGTH_SHORT).show();
}
});
Toast.makeText(YTSDKActivity.this, "游戏回调登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void loginError(LoginErrorMsg errorMsg) {
// TODO Auto-generated method
if (errorMsg != null) {
Toast.makeText(YTSDKActivity.this, "游戏回调" + errorMsg.msg,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(YTSDKActivity.this, "游戏回调登录失败", Toast.LENGTH_SHORT).show();
}
}
});
该接口用于在游戏中切换账号调用,调用接口会弹出登录窗口。
12.Application初始化接口
YTSDKManager.qfInitApplication(getApplicationContext());
- 该接口必须在程序Application的oncreat()方法中调用,否则不能正确执行。
- 如果平台没有提供DJ_BAIDUID和DJ_BAIDUKEY参数,可不调用此接口。
- 游戏包包名必须与提供包名保持一致。
接口说明
1.SDK初始化
SDK提供工具类YTSDKManager,游戏接入必须获取该类实例。 获取实例方法:
//方法1
YTSDKManager.getInstance(Activity context)
//方法2
YTSDKManager.getInstance(Activity context,InitCallback callback)
初始化SDK时需要调用(方法2),需要监听初始化成功与失败回调。
初始化成功后如果当前YTSDKManager对象没有调用过destroy()方法,那么想再次获取YTSDKManager实例,只需调用(方法1)即可。
YTSDKManager.getInstance(Activity context)可以多次调用,不会影响程序运行性能.
2.登录/注册
完成SDK初始化后,通过获取到的实例调用登录接口,当用户第一次安装时会调起登录窗口:
登录窗口提供一下功能:
- 一键注册
- 手机注册
- 短信验证码登录
- 找回密码
如果用户有登录过,会根据接口传递的参数判断是否进行自动登录,自动登录会延迟二秒执行登录操作,以便于用户进行切换账户。
SDK登录成功后默认展示浮标。
接口定义
public void showLogin(acontext, Boolean isShowQuikLogin,OnLoginListener loginlistener)
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
acontext | Context | 上下文路径 |
isShowQuikLogin | boolen | 是否显示快捷登录,true为快捷登录/false不显示快捷登录 |
onloginListener | OnLoginListener | 登录接口回调 |
回调说明
loginSuccess(LogincallBack logincallback) //登录成功
loginError(LoginErrorMsg logincallback) //登录失败
- LogincallBack:
参数名 | 类型 | 参数说明 |
---|---|---|
mem_id | String | 登录成功后用户ID(唯一) |
user_toke | String | 用户toke(唯一用户服务端校验) |
- loginError:
参数名 | 类型 | 参数说明 |
---|---|---|
code | int | 登录失败错误码 |
msg | String | 登录失败的消息提示 |
完整示例
sdkManager.showLogin(this, true, new OnLoginListener() {
@Override
publicvoid loginSuccess(LogincallBack logincallback) {
//登录成功
if(logincallback!=null){
String user_id = logincallback.mem_id;
String user_token = logincallback.user_token;
}
}
@Override
publicvoid loginError(LoginErrorMsg errorMsg) {
if(errorMsg!=null){
// 登录失败的借口回调,CP自行调用
intcode = errorMsg.code;// 登录失败的状态码
String msg = errorMsg.msg;// 登录失败的消息提示
}
}
});
3.购买道具
在完成初始化并已经获取到SDK实例的情况下,购买游戏内道具时调用此接口,为游戏提供支付系统。
安卓SDK提供多种稳定支付方式,由平台自行控制。
接口定义
public void showPay(Context ctx,String roleId, String money,String serverId,
String productId,String productName, String productDesc, String attach, String serverName, String roleName,OnPaymentListener paymentListener
)
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
ctx | String | 上下文路径(必传) |
roleId | String | 角色ID(必传) |
money | String | 支付金额(必传) |
serverId | String | 区服ID(必传) |
productId | String | 产品ID(必传) |
productName | String | 商品名称(必传) |
productDesc | String | 商品明细 (必传) |
attach | String | 扩展信息(必传CP订单号) |
serverName | String | 区服名称 |
roleName | String | 角色名称 |
paymentListener | OnPaymentListener | 支付客户端回调接口(必传) |
回调说明
paymentSuccess(PaymentCallbackInfo callbackInfo) //支付成功
paymentError(PaymentErrorMsg errorMsg) //支付失败
- PaymentCallbackInfo:
参数名 | 类型 | 参数说明 |
---|---|---|
msg | String | 支付结果文字描述 |
money | String | 支付金额 |
- PaymentErrorMsg:
参数名 | 类型 | 参数说明 |
---|---|---|
code | int | 支付失败错误码 |
msg | String | 支付失败的消息提示 |
money | String | 支付金额 |
完整示例
sdkManager.showPay(this, "角色ID", money, "区服ID","产品ID", "产品名称", "产品详情","CP订单号", "区服名称","角色名称" ,new OnPaymentListener() {
@Override
publicvoid paymentSuccess(PaymentCallbackInfo callbackInfo) {
if(callbackInfo!=null){
double money = callbackInfo.money;
String msg = callbackInfo.msg;
}
}
@Override
publicvoid paymentError(PaymentErrorMsg errorMsg) {
// TODO Auto-generated method stub
if(errorMsg!=null){
int code = errorMsg.code;
double money = errorMsg.money;
String msg = errorMsg.msg;
}
// 弹出支付失败信息,一般不用
/*
* Toast.makeText( getApplication(), "充值失败:code:" +
* errorMsg.code + " ErrorMsg:" + errorMsg.msg +
* " 预充值的金额:" + errorMsg.money,
* Toast.LENGTH_LONG).show();
*/
}
});
4. 创角
在完成初始化并已经获取到SDK实例的情况下,用户创建角色时调用。
注:平台需要进行数据分析,因此该接口请务必调用接口定义
public void addUserRole(final Context context, final String serverName,
final String serverId, final String roleName, final String roleId,final String roleGrade, final RolekCallback roleCallBack)
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
context | Context | 上下文路径(必传) |
serverName | String | 区服名称(必传) |
serverId | String | 区服ID(必传) |
roleName | String | 角色名称(必传) |
roleId | String | 角色ID(必传) |
roleGrade | String | 角色等级 (必传) |
roleCallBack | RolekCallback | 客户端回调接口(必传) |
回调说明
onSuccess(Object responseString) //提交成功
onFailure(Object failureString) //提交失败
创角接口在后台提交,对接过程中不需要处理上报结果, 为了不影响用户游戏体验,不管上报失败还是成功尽量不要弹出提示。
完整示例
ttwsdkmanager.addUserRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999",
new RolekCallback() {
@Override
public void onSuccess(Object responseString) {
// TODO Auto-generated method stub
// 正式游戏不要弹Toast
Toast.makeText(YTSDKActivity.this, "创角信息提交成",
Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Object failureString) {
// TODO Auto-generated method stub
}
});
5. 游戏退出
- 游戏退出时调用接口,在已经获取到SDK实例的情况下退出游戏时调用。
- 此接口用于SDK资源回收内存释放,为了游戏性能、用户体验,必须调用此接口。
- 游戏退出接口弹出"是否退出游戏窗口",用户点击会执行相应的回调方法。
接口定义
doOutAdavert(Context context, boole canBack, GameOutCallback callBack)
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
context | Context | 上下文路径(必传) |
canBack | boole | 是否允许返回(必传) |
callBack | GameOutCallback | 用户点击回调(必传) |
回调说明
onSuccess() //点击确认
onFail() //点击取消
完整示例
ttwsdkmanager.doOutAdavert(this, true, new GameOutCallback() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
YTSDKActivity.this.finish();
}
@Override
public void onFail() {
// TODO Auto-generated method stub
Logger.msg("点击再玩一会 = " + "再玩一会");
}
});
<<<<<<< HEAD
6. 实名认证
- 游戏如果使用sdk提供的实名认证功能,必须调用此接口。
- 实名认证接口调用必须保证用户已经完成登陆
- 实名认证接口会根据当前用户是否实名认证回调给游戏身份证信息和年龄信息。
接口定义
showRealName(Context context, RealNameCallback callback )
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
context | Context | 上下文路径(必传) |
canBack | RealNameCallback | 实名认证结果回调(必传) |
回调说明
//实名认证返回结果
//1、当sdk后台设置当前游戏实名认证由sdk控制,返回drvId为"-1",age为-1
//2、新注册的用户1小时内不会弹出实名认证窗口,返回drvId为"0",age为0
//3、用户已经实名认证,则返回实际身份证和年龄
//4、用户未实名认证且实名认证交由CP控制,则弹出实名认证页面,认证完成返回正确的身份证和年龄,用户取消认证则返回0
//5、实名认证逻辑在游戏对接时,cp方可预先与我方约定由哪一方控制实现。
onRealSuccess()
onRealFail() //点击其他异常情况会走此方法。返回字符串异常case
完整示例
ttwsdkmanager.showRealName(this, new RealNameCallback() {
@Override
public void onRealSuccess(String arg0) {
// TODO Auto-generated method stub
//{"drvId":"身份证号码","age":年龄(整型)}
Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
}
@Override
public void onRealFail(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
}
});
7.切换账号
用于在游戏中切换账号
接口定义
public void switchAccount(Activity acontext, OnLoginListener loginlistener)
参数说明
参数名 | 类型 | 参数说明 |
---|---|---|
acontext | Activity | 上下文路径 |
onloginListener | OnLoginListener | 登录接口回调 |
回调说明
loginSuccess(LogincallBack logincallback) //登录成功
loginError(LoginErrorMsg logincallback) //登录失败
- LogincallBack:
参数名 | 类型 | 参数说明 |
---|---|---|
mem_id | String | 登录成功后用户ID(唯一) |
user_toke | String | 用户toke(唯一用户服务端校验) |
- loginError:
参数名 | 类型 | 参数说明 |
---|---|---|
code | int | 登录失败错误码 |
msg | String | 登录失败的消息提示 |
完整示例
sdkManager.switchAccount(this, new OnLoginListener() {
@Override
publicvoid loginSuccess(LogincallBack logincallback) {
//登录成功
if(logincallback!=null){
String user_id = logincallback.mem_id;
String user_token = logincallback.user_token;
}
}
@Override
publicvoid loginError(LoginErrorMsg errorMsg) {
if(errorMsg!=null){
// 登录失败的借口回调,CP自行调用
intcode = errorMsg.code;// 登录失败的状态码
String msg = errorMsg.msg;// 登录失败的消息提示
}
}
});
混淆
SDK核心代码是以jar包及资源文件提供给用户的,其中jar包已经半混淆状态。
您在混淆自己APK包的时候请不要将game_sdk-xx的jar包再次混淆,若被混淆后可能会出现其他错误。
您可以在用ant构建混淆包的build.xml里面对应位置或者在proguard.cfg里加入:
-libraryjarslibs/.jar以避免jar包被混淆。
SDK其他引用的第三方框架尽可能的不进行二次混淆
微信支付混淆:-keep class com.ipaynow.plugin.** {;}
数美混淆: -keep class com.ishumei. { *; }
客服模块混淆:v2.3.6版本开始需要添加混淆:
-dontwarn com.qiyukf.
-keep class com.qiyukf. {*;}
-dontwarn com.netease.
-keep class com.netease. {*;}
-dontwarn org.slf4j. {;}
-keep class org.slf4j.** { ; }
FAQ
初始化提示接口校验不通过
检查本地清单文件配置(APPID、CLIENTID、CLIENTKEY)是否配置正确
充值回调失败
检查提供的回调地址是否正确,接口请求格式是否正确。
微信支付无法启动微信
检查SDK中的Assets目录下的资源文件(kprogresshud_spinner.png)是否存在。
登录接口调用二次才弹出登录页问题
接入过程中,需要先调用YTSDKManager.getInstance(activity)初始化,再去调用showLogin(),请使用带回调的接口实现初始化,YTSDKManager.getInstance(this, new InitCallback() {})
支付宝支付无法拉起支付
请检查所引用的支付宝jar版本是否跟SDK保持一致。是否有支付宝第三方包冲突。
微信支付提示动态库加载失败
检查第三方jar包是否被二次混淆。添加-keep class com.ipaynow.plugin.* {;}
安卓9手机出现输入法输入不显示内容情况
在游戏首页Activity配置中新增属性:android:hardwareAccelerated="true"