Commit a4ff7262 authored by gaorui's avatar gaorui
Browse files

feat(app):新增海外迁移SDK参考项目

parent 8ab9403c
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven {
url 'https://sdk.wdyxgames.com/nexus/repository/sdk-public/'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.2'
classpath 'com.google.gms:google-services:4.2.0'
}
}
allprojects {
repositories {
maven {
url 'https://sdk.wdyxgames.com/nexus/repository/sdk-public/'
}
}
}
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 33
defaultConfig {
applicationId "com.hoolai.oversea.access"
minSdkVersion 26
targetSdkVersion 33
versionCode 10
versionName "1.1.0"
multiDexEnabled true
multiDexKeepProguard file('dexknife.txt')
}
dexOptions {
jumboMode true
}
lintOptions {
abortOnError false
}
signingConfigs {
yourkeystore {
keyAlias 'access'
keyPassword 'access123'
storeFile file("${rootProject.projectDir.absolutePath}/keystorefile/access_global.keystore")
storePassword 'access123'
}
}
buildTypes {
debug {
minifyEnabled false //是否混淆
signingConfig signingConfigs.yourkeystore
}
release {
minifyEnabled false //是否混淆
signingConfig signingConfigs.yourkeystore
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'com.hoolai.access.open:fast-access:1.0.0.3'
implementation 'com.hoolai.access.open:hoolai-core:1.0.0.0-global12'
implementation 'com.hoolai.oversea:hl-oversea-global:1.0.0.0-dev5'
/* implementation 'com.hoolai.open.fastaccess:fastaccess_sdk:2.3.16'
implementation files('libs\\hoolai_reyun_3.1.16.aar')
implementation files('libs\\oversea_base_3.2.3.aar')
implementation files('libs\\oversea_global_3.3.7.aar')
implementation files('libs\\oversea_login_3.2.1.aar')
implementation files('libs\\oversea_pay_3.2.1.aar')
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.recyclerview:recyclerview:1.2.0'
//implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
*//**
* google
*//*
implementation 'com.google.android.gms:play-services-base:17.0.0'
implementation 'com.google.android.gms:play-services-auth:20.4.0'
// implementation 'com.google.android.gms:play-services-games:19.0.0'
implementation "com.google.android.gms:play-services-games-v2:+"
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
implementation 'com.android.billingclient:billing:6.0.0'
*//**
* firebase
*//*
implementation 'com.google.firebase:firebase-bom:31.1.1'
implementation 'com.google.firebase:firebase-analytics:21.2.0'
implementation 'com.google.firebase:firebase-messaging:23.1.1'
*//**
* facebook
*//*
implementation 'com.facebook.android:facebook-share:15.2.0'
implementation 'com.facebook.android:facebook-login:15.2.0'
implementation 'com.facebook.android:facebook-applinks:14.1.0'
*//**
* twitter
*//*
implementation 'com.twitter.sdk.android:twitter:3.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.2.0'
implementation 'com.squareup.retrofit2:converter-gson:2.2.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'com.google.code.gson:gson:2.8.7'
*//**
* AIHelp
*//*
implementation 'net.aihelp:android-aihelp-aar:3.1.+'
implementation 'androidx.viewpager2:viewpager2:1.0.0'
*//**
* af 广告
*//*
implementation 'com.appsflyer:af-android-sdk:6.12.2'
//implementation 'com.appsflyer:oaid:6.1.1'
implementation 'com.android.installreferrer:installreferrer:2.2'
//af 卸载衡量
implementation 'com.google.firebase:firebase-messaging:23.0.3'
implementation 'com.google.firebase:firebase-core:20.1.2'*/
}
# 不进行dex分包, 直到 dex 的id数量超过 65536.
#-auto-maindex
# dex 扩展参数, 例如 --set-max-idx-number=50000
# 如果出现 DexException: Too many classes in --main-dex-list, main dex capacity exceeded,则需要调大数值
-dex-param --set-max-idx-number=49000
# if you want to keep some classes in main dex, use '-keep'.
-keep android.support.multidex.**
-keep android.support.v4.**
-keep androidx.core.**
-keep com.hoolai.demo.**
-keep org.jboss.netty.**
-keep com.hoolai.open.**
-keep com.hoolai.sdk.**
-keep com.hoolai.fatacess.**
-keep com.hoolai.overseas.sdk.Application.*
-keep com.adobe.**
-keep com.android.vending.billing.**
-keep com.google.android.gms.R.**
-keep com.google.android.gms.R$*.class
-keep com.google.android.gms.common.R.**
-keep com.google.android.gms.common.R$*.class
-keep org.OpenUDID.**
-keep com.alibaba.fastjson.**
# this path will to be split to second dex.
#android.**
#-split android.** # same as android.**
{
"project_info": {
"project_number": "242883477374",
"project_id": "access-f4133",
"storage_bucket": "access-f4133.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:242883477374:android:f7b5a4a9564fcd86e3bd2f",
"android_client_info": {
"package_name": "com.hoolai.oversea.access"
}
},
"oauth_client": [
{
"client_id": "242883477374-p0j6gg8pjibens17rfibf1tsd1d72tkm.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.hoolai.oversea.access",
"certificate_hash": "bc8591140a47250db392865765c4ce7d4e5b8b96"
}
},
{
"client_id": "242883477374-s5a7d489td3s976hcgmcqq1nar7aqrie.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.hoolai.oversea.access",
"certificate_hash": "c6889e4b5808728c7e1d82baed969e8351a2dd4e"
}
},
{
"client_id": "242883477374-7u4f0fvqg2a6jrd7ro6sat6ms2ledtml.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAR9uWzd7yaXb6cDOY1HcDk46JZaEqMhgA"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "242883477374-7u4f0fvqg2a6jrd7ro6sat6ms2ledtml.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.hoolai.fastsdk.demo">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--
下面这个标签是andriod11新增的,如果遇到Error: Missing 'package' key attribute on element package
解决方案:https://android-developers.googleblog.com/2020/07/preparing-your-build-for-package-visibility-in-android-11.html
-->
<queries>
<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
</queries>
<application
android:name="com.hoolai.demo.GameApplication"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:usesCleartextTraffic="@xml/network_security_config"
tools:remove="android:appComponentFactory">
<!--usesCleartextTraffic android 高版本系统中支持http访问-->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name="com.hoolai.demo.GameActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="sensor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.hoolai.demo.share.FacebookShareActivity"
android:exported="false" />
<!-- demo分享类,无需拷贝 -->
<activity
android:name="com.hoolai.demo.share.ShareActivity"
android:exported="false"/>
<!-- demo 示例 end-->
<!--Facebook login and share-->
<!-- facebook share 注意这里的facebook_app_id需要直接替换成参数本身,比如987654321-->
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider987654321"
android:exported="true" />
<!-- share-->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
<meta-data
android:name="com.facebook.sdk.ClientToken"
android:value="@string/facebook_client_token" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<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:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<!--Facebook end-->
<meta-data
android:name="com.google.android.gms.games.APP_ID"
android:value="@string/game_services_project_id" />
<!--屏幕适配,请自定义适配,以下为示例-->
<!--<meta-data android:name="android.max_aspect"
android:value="ratio_float"/>-->
<!-- openInstall,未使用时可删除该配置;使用时请更新openInstallKey为正式参数 -->
<meta-data
android:name="com.openinstall.APP_KEY"
android:value="$[openInstallKey]"
tools:replace="android:value" />
<!--openInstall (可选)
使用时注意:在应用入口类添加以下配置,使用浏览器可以拉起
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="此处咨询运营要参数"/>
</intent-filter>
-->
</application>
</manifest>
\ No newline at end of file
F5OvkhmmnIQ+3ot6Y0R6mlEfM/pduDHyhPPJ4t9FsdEGstVHsBh13LCUjQZoOXb4f+11nTHw2S7gNJ5lVskOypSbR9GuujINqicrCO6ij2hoTNSW6ikKxik/d+a9hE/hEosC2h0loEE1IcAaQlgJ7QYakJIsXeQz2O2GRbVstklmbdnFrenerx5iKDfMA4Z1MS9JVYuwTcQDodrRXDq96mMh/nnDZRqeLSA+yaqrsnOnr6GXACaerHDYMNXcaUOlMiJLYYW7a9mJjBXFNdpq2zMgyyw77DJ29oKk0P5uSIZ9xDcfllnZZV07oJ5ikYwGUvw8JZSy40jXaEArW1G0UQRcUIzY4tSgCmQUe0vGaCittAE7e3/914N2NVAMuN3ZObmwTN+ufpJfdubnnAFqhSjIQse0lJ8twRn24/yCdacDVehke4nISTSm8A5CCFjmEDJeeLas1wvCoWaL2DxThIWJlebZA4GcNS/S0kHXY8FKZPRlPpXDUCdAOBoO3XzWMy4pkpRb7f0xMhQAEucmerX/g8TzilAXRjhGgBZLWbck3VdUDBec3Wb+yKObih3kmqTek0VkyXCRupZNHIlw/Df4yB1SBGaFpiTDFBdYIwfXYdxKTWeJTzXl7MhqcByxXMGIaVHyOKWq56/giUhTbBpcrEp+HztAsQleuP7bn6dnTZy6TFDyhyIQrVE5bNIZhBZxeHBLyfZK3q2wkEKMNb/JAmukaNcLmPGbsVKl3r9Wl1QdqdK3roAJAxz7o3nJ1yjwXPNpeFEiBvEPEX783ELcwcV0t2ojdN1vVMh7UFlralHzgUdEsrhM2dJfRBkrk/IF9BvVq1i5jpm9gIMJhGywWrkxLUG6yBFbBItKUxeYLTaNJKV7MrV+F0t1K1243QECrKQ6jB2tFoPiD5y9/OuOIkoLiX3h+2nQR3Zgh7yi4FvoapH+/zo91LLqmG2KZ+AP8wwEe2GrG04k974fCy4OzQWjw6qfmHN5r4W9nfR9ocQRs2N+M8FeeRDiK5HBI88CVKYdYFANDV63UfL6kCeZQ/+5b8ULbEr3zhx0ALY3daRcUcMmXPlgzWZiJiXm8PxbYPKUfrzzsUcpHqNh2kCTcIEtw4tV0/T11NxUCOMgkiO4QJoFE+DPcbrHkpTPLormp/BjgAlG9Ifjulf1LKD0bTIX6BBHS5XGSx6oUqjtG2oXTzytahtPPZKCR3mEjkPVwbLTgGlK+ZSHNTIGOs+sIthQbh3FHzN97JLHBIPvehJPXFUMuApF8Eju9nWgMiI/NUifyexbZidue0lzyrt9U3BYKSVNYLBAAjLb9fXVplEjhxKYPE+GGpsRHT7hqaSngpDntvsrrDZhF8OTbHCRrgbzpWa4TJw7ni3D8t3Lj8MXHhE6BRMDdPCZP96mK6cuESd19hqSe0N502pX3nVuNhJMUfLXILOEvqii4MWjFyyQBBgcsG1JNYeSMZJwv0walsjO7A7uYGW9yZmtz/u4OSua3g4noQru4IpErdAwkRjUYRSKz5hvrD9Y+wVhcHEObDjDR+V/4BBiBhdq96iqyonZhfrPomjM7ItVqK+Oyb7rF9jiphhdgxgaD+kQ0Hownz2jqAqcsWnugGwLuw8w60rrEx9EHs5ERDA/DmsvfjU/iQXDsiUQWaZws+Yar9S+nbIJ5jyVl8gq6Qx7ug9Xb1Et6RgZ4R+S+sr0nS0=
\ No newline at end of file
[default,zh-Hans]
NETWORK_ERROR = 网络异常
ERROR = core 内通用非ok码
DATA_ILLEGAL = 数据非法
SANDBOX_OR_RESOURCE_EMPTY = 沙盒或资源目录为空
INIT_CFG_ERROR = 初始化配置文件异常
INIT_ACCOUNT_ERROR = 初始化账号列表异常
INIT_PAYMENT_ERROR = 初始化支付系统异常
NOT_START_SYSTEM = 没有启动系统
ALREADY_INIT_SYSTEM = 系统已经初始化
PARSE_RESPONSE_ERROR = 解析响应错误
PARSE_INIT_INFO_ERROR = 解析初始化数据错误
PARSE_LOGIN_INFO_ERROR = 解析登陆信息异常
USERNAME_OR_PASSWORD_EMPTY = 用户名或密码为空
ACCOUNT_ID_OR_CODE_EMPTY = 账户ID或账户码为空
ACCOUNT_ALREADY_BIND_CHANNEL = 账号已经绑定当前渠道
PHONE_OR_CODE_EMPTY = 手机号或验证码为空
PHONE_NUMBER_EMPTY = 手机号码为空
PHONE_FORMAT_ERROR = 手机号码格式错误
QUICK_AUTH_TOKEN_EMPTY = 快速登陆授权Token为空
NOT_SURE_ALL_INTERACTIVE = 未确认所有的对话框交互
NOT_EXIST_SERVICE_DIALOG = 不存在业务对话框
ALREADY_LOGIN = 已经登陆
LOGIN_FAILED = 登录失败
REMOVE_ACCOUNT_ERROR = 删除账号失败
PAYMENT_ERROR = 支付异常
CREATE_LOCAL_ORDER_ERROR = 创建本地订单异常
EXIST_LOCAL_ORDER = 存在本地未完成订单
REMOVE_LOCAL_ORDER_ERROR = 移除本地订单异常
NOT_IN_INIT = 当前不在初始化状态
NOT_IN_LOGIN = 当前不在登陆状态
INIT_SYSTEM_ERROR = 初始化系统异常
INIT_PREFERENCES_ERROR = 初始化用户偏好设置异常
EXIST_VIEW_NOT_CLOSE = 存在未被关闭的view
CURRENT_VIEW_NOT_OPENED = 当前view未被打开
FETCH_DESC_FAILED = 抓取异常描述失败
NOT_EXIST_CHILD_ACCOUNT = 当前小号不存在
NAME_OR_IDENTITY_EMPTY = 姓名或身份证为空
ACCOUNT_INFO_NOT_EXIST = 账号信息不存在
ORDER_INFO_NOT_EXIST = 订单信息不存在
CHANNEL_NOT_SUPPORT_LOGIN = 渠道登陆不支持
NOT_SUPPORT_OPERATOR = 当前操作不支持
PLEASE_RESTART_UPDATE = 更新已完成,请重启
LOCALIZATION_UPDATE_RESTART = 国际化文件已更新,重启生效
CONFIGRATION_UPDATE_RESTART = 配置文件已更新,重启生效
NOT_GENUINE_APP = 非正版应用,请下载正版应用
CANCEL_REAL_NAME = 取消实名认证
UNOFFICIAL_AUTHENTICATION = 非官方认证登录
UNKNOWN = 未知异常
enterGame = 进入游戏
policyPrivacy = 阅读并同意[隐私条款]及[用户协议]
otherLogin = 其它登录方式
realAuth = 实名认证
quickLogin = 快速登录
phoneQuickLogin=本机号码一键登录
pleaseInputPwd = 请输入密码
pleaseInputAccount = 请输入账号
getVerifyCode = 验证码
pleaseInputVerifyCode = 请输入验证码
pleaseInputPhone = 请输入手机号
tip = 提示
authorization = 认证
cancel = 取消
sure = 确定
pleaseInputIdentifyId = 请输入身份证号
pleaseInputName = 请输入姓名
realNameRules = 根据国家新闻出版署《关于防止未成年沉迷网络游戏的通知》,未实名账号不可体验游戏,请尽快完成实名登记
mainEnter = 主号进入
chileEnter = 小号进入
checkedPrivace = 请先勾选并同意相关政策条款再登录游戏
checkPermissionTip = 由于您已拒绝%权限,开启该功能需要打开“设置”>“权限管理”进行授权
realNameError = 您输入的姓名格式不正确
idCardError = 您输入的身份证格式不正确
phoneError = 手机号码格式不正确
vcodeError = 验证码格式不正确
pwdError = 密码格式不正确
getVcodeFailed = 获取验证码失败
bindAccount = 绑定账号
bindAccountTip = 当前渠道账号未绑定游客
guestAccountTip = 当前账号为游客账号,请尽快绑定三方账号,避免账号丢失
guestSwitchTip = 您当前为游客账号,切换账号将丢失当前游客账号的游戏进度
bindingAccountTip = 当前账号已绑定%s账号
accountId = 账号ID
accountCode = 账号码
bindAccountIdPlaceholder = 请输入账号恢复Id
bindAccountCodePlaceholder = 请输入账号恢复码
bindIdCodedescription = 当更换设备时可在切换账号页面中输入当前的恢复Id和恢复码,就可以使用原有账号角色数据继续游戏
unbindIdCodedescription = 如果账号未绑定任何三方账号,可输入账号恢复Id和恢复码用来切换账号
switchAccountTip = 当前登录的渠道账号已绑定其他游客账号,是否进行切换
switchAccount = 切换账号
switchAccountFailture = 切换账号失败
sameAccountTip = 当前账号已登录
loginSuccessTip = 用户%s,登录成功
orderValidate = 订单核验中...
startingPay = 开始购买
purchaseing = 购买中...
[en]
NETWORK_ERROR = Network exception
ERROR = General non-OK code within the core
DATA_ILLEGAL = Illegal data
SANDBOX_OR_RESOURCE_EMPTY = Sandbox or resource directory is empty
INIT_CFG_ERROR = Initialization configuration file exception
INIT_ACCOUNT_ERROR = Initialization account list exception
INIT_PAYMENT_ERROR = Initialization payment system exception
NOT_START_SYSTEM = System not started
ALREADY_INIT_SYSTEM = System already initialized
PARSE_RESPONSE_ERROR = Parse response error
PARSE_INIT_INFO_ERROR = Parse initialization data error
PARSE_LOGIN_INFO_ERROR = Parse login information exception
USERNAME_OR_PASSWORD_EMPTY = Username or password is empty
ACCOUNT_ID_OR_CODE_EMPTY = Account ID or account code is empty
ACCOUNT_ALREADY_BIND_CHANNEL = Account already bound to the current channel
PHONE_OR_CODE_EMPTY = Phone number or verification code is empty
PHONE_NUMBER_EMPTY = Phone number is empty
PHONE_FORMAT_ERROR = Phone number format is incorrect
QUICK_AUTH_TOKEN_EMPTY = Quick login authorization token is empty
NOT_SURE_ALL_INTERACTIVE = Not all dialog interactions are confirmed
NOT_EXIST_SERVICE_DIALOG = Service dialog does not exist
ALREADY_LOGIN = Already logged in
LOGIN_FAILED = Login failed
REMOVE_ACCOUNT_ERROR = Failed to remove account
PAYMENT_ERROR = Payment exception
CREATE_LOCAL_ORDER_ERROR = Exception occurred when creating a local order
EXIST_LOCAL_ORDER = Existing local incomplete order
REMOVE_LOCAL_ORDER_ERROR = Exception occurred when removing a local order
NOT_IN_INIT = Not in initialization state
NOT_IN_LOGIN = Not in login state
INIT_SYSTEM_ERROR = Initialization system exception
INIT_PREFERENCES_ERROR = Initialization user preference settings exception
EXIST_VIEW_NOT_CLOSE = Existing unclosed view
CURRENT_VIEW_NOT_OPENED = Current view not opened
FETCH_DESC_FAILED = Failed to fetch exception description
NOT_EXIST_CHILD_ACCOUNT = Current child account does not exist
NAME_OR_IDENTITY_EMPTY = Name or ID card is empty
ACCOUNT_INFO_NOT_EXIST = Account information does not exist
ORDER_INFO_NOT_EXIST = Order information does not exist
CHANNEL_NOT_SUPPORT_LOGIN = Channel login not supported
NOT_SUPPORT_OPERATOR = Current operation not supported
PLEASE_RESTART_UPDATE = Update completed, please restart
LOCALIZATION_UPDATE_RESTART = Localization files updated, restart required
CONFIGRATION_UPDATE_RESTART = Configuration files updated, restart required
NOT_GENUINE_APP = Non-genuine application, please download the official version
CANCEL_REAL_NAME = Cancel real-name authentication
UNOFFICIAL_AUTHENTICATION = Unofficial authentication login
UNKNOWN = Unknown exception
enterGame = Enter the game
policyPrivacy = Read and agree to [Privacy Policy] and [User Agreement]
otherLogin = Other login methods
realAuth = Real-name authentication
quickLogin = Quick login
phoneQuickLogin = Quick login with caller ID
pleaseInputPwd = Please enter the password
pleaseInputAccount = Please enter the account
getVerifyCode = Verification code
pleaseInputVerifyCode = Please enter the verification code
pleaseInputPhone = Please enter the phone number
tip = Tip
authorization = Authorization
cancel = Cancel
sure = Confirm
pleaseInputIdentifyId = Please enter the ID card number
pleaseInputName = Please enter the name
realNameRules = According to the requirements of the National Press and Publication Administration's "Notice on Preventing Minors from Being Addicted Online Games", unverified accounts cannot experience the game. Please complete real-name authentication as soon as possible.
mainEnter = Enter with main account
childEnter = Enter with child account
checkedPrivace = Please check and agree to the relevant policy terms before logging into the game
checkPermissionTip = As you have denied the % permission, enabling this feature requires opening "Settings" > "Permission Management" for authorization
realNameError = The name you entered is not in the correct format
idCardError = The ID card you entered is not in the correct format
phoneError = Incorrect phone number format
vcodeError = Incorrect verification code format
pwdError = Incorrect password format
getVcodeFailed = Failed to get verification code
bindAccount = Bind account
bindAccountTip = Current channel account is not bound to a guest account
guestAccountTip = Current account is a guest account, please bind to a third-party account as soon as possible in case of loss of account
guestSwitchTip = You are currently a guest account, Switching accounts will lose the game progress of the current guest account
bindingAccountTip = Current account is already bound to %s account
accountId = Account ID
accountCode = Account code
bindAccountIdPlaceholder = Please enter account recovery ID
bindAccountCodePlaceholder = Please enter account recovery code
bindIdCodedescription = When switching devices, you can input the current recovery ID and recovery code on the account switch page to continue using the original account character data
unbindIdCodedescription = If the account is not bound to any third-party account, you can enter the account recovery ID and recovery code to switch accounts
switchAccountTip = The current logged-in channel account is already bound to another guest account. Do you want to switch?
switchAccount = Switch account
switchAccountFailture = Failed to switch account
sameAccountTip = Current account is already logged in
loginSuccessTip = User %s logged in successfully
orderValidate = Order validation in progress...
startingPay = Start purchasing
purchaseing = Purchasing...
[es]
NETWORK_ERROR = Error de red
ERROR = Código no ok universal dentro del core
DATA_ILLEGAL = Datos inválido
SANDBOX_OR_RESOURCE_EMPTY = Entorno de pruebas o directorio de recursos vacío
INIT_CFG_ERROR = Error al inicializar archivo de configuración
INIT_ACCOUNT_ERROR = Error al inicializar lista de cuentas
INIT_PAYMENT_ERROR = Error al inicializar el sistema de pago
NOT_START_SYSTEM = Sistema no iniciado
ALREADY_INIT_SYSTEM = Sistema inicializado
PARSE_RESPONSE_ERROR = Error al analizar respuesta
PARSE_INIT_INFO_ERROR = Error al analizar datos de inicialización
PARSE_LOGIN_INFO_ERROR = Error al analizar información de inicio de sesión
USERNAME_OR_PASSWORD_EMPTY = Nombre d usuario o contraseña vacía
ACCOUNT_ID_OR_CODE_EMPTY = ID de cuenta o código de cuenta vacío
ACCOUNT_ALREADY_BIND_CHANNEL = Cuenta vinculada al canal actual
PHONE_OR_CODE_EMPTY = Número de teléfono móvil o código de verificación vacío
PHONE_NUMBER_EMPTY = Número de teléfono móvil vacío
PHONE_FORMAT_ERROR = Error de formato de teléfono móvil
QUICK_AUTH_TOKEN_EMPTY = Token d autorización de inicio de sesión rápido vacío
NOT_SURE_ALL_INTERACTIVE = Todas las interacciones del cuadro de diálogo no confirmadas
NOT_EXIST_SERVICE_DIALOG = No existe el cuadro de diálogo de negocios
ALREADY_LOGIN = Sesión iniciada
LOGIN_FAILED = Inicio de sesión fallida
REMOVE_ACCOUNT_ERROR = Error al eliminar cuenta
PAYMENT_ERROR = Error de pago
CREATE_LOCAL_ORDER_ERROR = Error al crear pedido local
EXIST_LOCAL_ORDER = Hay pedido local pendiente
CREATE_LOCAL_ORDER_ERROR = Error al retirar pedido local
NOT_IN_INIT = No en estado de inicialización
NOT_IN_LOGIN = No en estado de inicio de sesión
INIT_SYSTEM_ERROR = Error al inicializar el sistema
INIT_PREFERENCES_ERROR = Error al inicializar configuración de preferencias de usuario
EXIST_VIEW_NOT_CLOSE = Hay view no cerrado
CURRENT_VIEW_NOT_OPENED = view actual abierto
FETCH_DESC_FAILED = Error al capturar descripción de anomalía
USER_INFO_NOT_EXIST=La cuenta auxiliar actual no existe
NAME_OR_IDENTITY_EMPTY = Nombre o documento de identificación vacío
ACCOUNT_INFO_NOT_EXIST = La información de cuenta no existe
ORDER_INFO_NOT_EXIST = La información de pedido no existe
CHANNEL_NOT_SUPPORT_LOGIN = No admite inicio de sesión del canal actual
NOT_SUPPORT_OPERATOR = No admite la operación actual
PLEASE_RESTART_UPDATE = Actualización terminada, reinicie
LOCALIZATION_UPDATE_RESTART = Archivo internacional actualizado, reinicie para que surta efecto
CONFIGRATION_UPDATE_RESTART = Archivo de configuración actualizado, reinicie para que surta efecto
NOT_GENUINE_APP = Aplicación no genuina, descargue una genuina
CANCEL_REAL_NAME = Cancelar autentificación de nombre real
UNOFFICIAL_AUTHENTICATION = Inicio de sesión de autenticación no oficial
UNKNOWN = Error desconocido
enterGame = Entrar en el juego
policyPrivacy = Lea y acepte los [Términos de Privacidad] y [Acuerdo de Usuario]
otherLogin = Otros métodos de inicio de sesión
realAuth = Autentificación de nombre real
quickLogin = Inicio de sesión rápido
phoneQuickLogin=Iniciar sesión con un solo clic con el número del teléfono móvil
pleaseInputPwd = Ingrese la contraseña
pleaseInputAccount = Ingrese la cuenta
getVerifyCode = Código de verificación
pleaseInputVerifyCode = Ingrese el código de verificación
pleaseInputPhone = Ingrese el número de teléfono móvil
tip = Aviso
authorization = Autentificación
cancel = Cancelar
sure = Confirmar
pleaseInputIdentifyId = Ingrese el número de identificación
pleaseInputName = Ingrese el nombre
realNameRules = Conforme a los requisitos del "Aviso sobre la Prevención de la Adicción de Menores de Edad a los Juegos en Línea" de la Administración Nacional de Prensa y Publicaciones, no se puede experimentar el juego sin una cuenta de nombre real, complete el registro de nombre real lo antes posible.
mainEnter = Ingresar con cuenta principal
chileEnter = Ingresar con cuenta auxiliar
checkedPrivace = Marque y acepte los términos de la política pertinente antes de iniciar sesión en el juego.
checkPermissionTip = Como ha denegado el permiso%, debe habilitar esta función yendo a "Configuración" > "Gestión de permisos" para autorizar
realNameError = El formato del nombre ingrsado es incorrecto
idCardError = El formato del documento de identificación ingresado es incorrecto
phoneError = El formato del número de teléfono móvil es incorrecto
vcodeError = El formato del código de verificación es incorrecto
pwdError = El formato de la contraseña es incorrecto
getVcodeFailed = Error al obtener código de verificación
bindAccount = Vincular cuenta
bindAccountTip = La cuenta actual del canal no está vinculada a visitado
guestAccountTip = Es la cuenta de visitado, vincule la cuenta de un tercero lo antes posible para evitar la pérdida de la cuenta.
guestSwitchTip = Actualmente eres una cuenta de invitado, Al cambiar de cuenta, se perderá el progreso del juego de la cuenta de invitado actual.
bindAccountTip = La cuenta actual está vinculada a la cuenta %s
accountId = ID de cuenta
accountCode = Número de cuenta
bindAccountIdPlaceholder = Ingrese Id de recuperación de cuenta
bindAccountCodePlaceholder = Ingrese el código de recuperación de la cuenta
bindIdCodedescription = Al cambiar el dispositivo, puede introducir el Id de recuperación actual y el código de recuperación en la página de cambio de cuenta, y continuar el juego con los datos del personaje de la cuenta original.
unbindIdCodedescription = Si la cuenta no está vinculada a ninguna cuenta de tercero, puede introducir el ID de recuperación de la cuenta y el código de recuperación para cambiar la cuenta.
switchAccountTip = La cuenta del canal de inicio de sesión actual está vinculada a otra cuenta de visitado, ¿cambiar?
switchAccount = Cambiar cuenta
switchAccountFailture = Error al cambiar cuenta
sameAccountTip = La cuenta actual se ha iniciado sesión
loginSuccessTip = Usuario %s, inicio de sesión con éxito
orderValidate = Verificando pedido...
startingPay = Comprar
purchaseing = Comprando...
[fr]
NETWORK_ERROR = Anomalie réseau.
ERROR = code non-ok générique dans le core.
DATA_ILLEGAL = Données illégales.
SANDBOX_OR_RESOURCE_EMPTY = Le répertoire du bac à sable ou des ressources est vide
INIT_CFG_ERROR = Erreur de profil d'initialisation.
INIT_ACCOUNT_ERROR = Erreur d'initialisation de la liste des comptes
INIT_PAYMENT_ERROR = Erreur d'initialisation du système de paiement
NOT_START_SYSTEM = Le système n'a pas démarré
ALREADY_INIT_SYSTEM = Le système est déjà initialisé
PARSE_RESPONSE_ERROR = Erreur d'analyse de la réponse.
PARSE_INIT_INFO_ERROR = Erreur d'analyse des données d'initialisation.
PARSE_LOGIN_INFO_ERROR = Erreur d'analyse des informations de connexion.
USERNAME_OR_PASSWORD_EMPTY = Le nom d'utilisateur ou le mot de passe est vide.
ACCOUNT_ID_OR_CODE_EMPTY = ID de compte ou code de compte vide
ACCOUNT_ALREADY_BIND_CHANNEL = Le compte a été lié au canal actuel
PHONE_OR_CODE_EMPTY = Le numéro de téléphone mobile ou le code de vérification est vide.
PHONE_NUMBER_EMPTY = Le numéro de téléphone mobile est vide
PHONE_FORMAT_ERROR = Le format du numéro de téléphone mobile est incorrect.
QUICK_AUTH_TOKEN_EMPTY = Le token d'autorisation de connexion rapide est vide.
NOT_SURE_ALL_INTERACTIVE = Toutes les interactions de la boîte de dialogue ne sont pas confirmées.
NOT_EXIST_SERVICE_DIALOG = Aucun dialogue commercial n'existe.
ALREADY_LOGIN = Déjà connecté.
LOGIN_FAILED = Échec de la connexion.
REMOVE_ACCOUNT_ERROR = Échec de la suppression du compte.
PAYMENT_ERROR = Erreur de paiement
CREATE_LOCAL_ORDER_ERROR = Erreur de création d'une commande locale.
EXIST_LOCAL_ORDER = Il y a une commande locale non remplie.
REMOVE_LOCAL_ORDER_ERROR = Supprimer une erreur de commande locale.
NOT_IN_INIT = Actuellement pas dans l'état d'initialisation.
NOT_IN_LOGIN = Pas encore connecté.
INIT_SYSTEM_ERROR = Erreur du système d'initialisation.
INIT_PREFERENCES_ERROR = Erreur d'initialisation des préférences de l'utilisateur.
EXIST_VIEW_NOT_CLOSE = Un view n'a pas été fermé.
CURRENT_VIEW_NOT_OPENED = Le view actuel n'est pas ouvert.
FETCH_DESC_FAILED = Échec de la saisie de la description des erreurs.
NOT_EXIST_CHILD_ACCOUNT = Le compte enfant n'existe pas.
NAME_OR_IDENTITY_EMPTY = Le nom ou ID est vide.
ACCOUNT_INFO_NOT_EXIST = L'information sur le compte n'existe pas.
USER_INFO_NOT_EXIST = L'information sur la commande n'existe pas.
CHANNEL_NOT_SUPPORT_LOGIN = La connexion au canal est non supportée.
NOT_SUPPORT_OPERATOR = L'opération actuelle n'est pas supportée.
PLEASE_RESTART_UPDATE = La mise à jour est terminée, veuillez redémarrer.
LOCALIZATION_UPDATE_RESTART = Le fichier d'internationalisation a été mis à jour, veuillez redémarrer pour qu'il prenne effet.
CONFIGRATION_UPDATE_RESTART = Le fichier de configuration a été mis à jour, veuillez redémarrer pour qu'il prenne effet.
NOT_GENUINE_APP = Application non authentique, veuillez télécharger l'application authentique.
CANCEL_REAL_NAME = Annuler la vérification de l'identité.
UNOFFICIAL_AUTHENTICATION = Connexion d'authentification non officielle.
UNKNOWN = Erreur inconnue.
enterGame = Entrer dans le jeu.
policyPrivacy = Lire et accepter [Politique de confidentialité] et [Accord de l'utilisateur].
otherLogin = Autres méthodes de connexion.
realAuth = La vérification de l'identité.
quickLogin = Connexion rapide.
phoneQuickLogin=Connexion en un clic avec le numéro local.
pleaseInputPwd = Veuillez saisir le mot de passe.
pleaseInputAccount = Veuillez saisir votre numéro de compte.
getVerifyCode = Code de vérification.
pleaseInputVerifyCode = Veuillez saisir le code de vérification.
pleaseInputPhone = Veuillez saisir le numéro de téléphone portable.
tip = Notice
authorization = Authentification
cancel = Annuler
sure = Confirmer
pleaseInputIdentifyId = Veuillez saisir le numéro d'identification.
pleaseInputName = Veuillez saisir votre nom.
realNameRules = Selon l’avis de l'Administration générale de la presse et des publications sur la prévention de l'accès des mineurs aux jeux en ligne, vous ne pouvez pas participer au jeu sans un compte à nom réel. Veuillez donc compléter l'enregistrement à nom réel dès que possible.
mainEnter = Entrée du compte main
chileEnter = Entrée du compte enfant
checkedPrivace = Veuillez cocher et accepter les conditions d'utilisation avant de vous connecter au jeu.
checkPermissionTip = Vous avez refusé la permission %, pour ouvrir cette fonction, vous devez ouvrir "Paramètres" > "Gestion des permissions" pour l'autorisation.
realNameError = Le nom que vous avez saisi n'est pas au bon format.
idCardError = Vous avez saisi un numéro d'identification incorrect.
phoneError = Le format de votre numéro de téléphone portable n'est pas correct.
vcodeError = Le code de vérification n'est pas dans le bon format.
pwdError = Le format du mot de passe est incorrect.
getVcodeFailed = Le code de vérification n'a pas été obtenu.
bindAccount = Lier le compte
bindAccountTip = Le compte de canal actuel n'est pas lié au visiteur.
guestAccountTip = Le compte actuel est un compte visiteur, veuillez lier un compte tiers dès que possible pour éviter une perte de compte.
guestSwitchTip = Vous êtes actuellement un compte invité. Changer de compte entraînera la perte de la progression du jeu du compte invité actuel.
bindingAccountTip = Le compte courant est lié au compte %s.
accountId = ID du compte
accountCode = Code du compte
bindAccountIdPlaceholder = Veuillez saisir le numéro de compte de recouvrement.
bindAccountIdPlaceholder = Veuillez saisir le code de recouvrement.
bindIdCodedescription = Lorsque vous changez d'appareil, vous pouvez saisir le numéro de compte et le code de recouvrement, puis vous pouvez utiliser les données de personnage du compte d'origine pour continuer le jeu.
unbindIdCodedescription = Si le compte n'est pas lié à un compte tiers, vous pouvez saisir le numéro de compte et le code de recouvrement pour changer de compte.
switchAccountTip = Le compte du canal actuellement connecté est lié à d'autres comptes visiteurs. Voulez-vous changer de compte ?
switchAccount = Changer de compte
switchAccountFailture = Échec du changement de compte
sameAccountTip = Le compte actuel est connecté
loginSuccessTip = Utilisateur%s, connexion réussie
orderValidate = Vérification de la commande en cours...
startingPay = Commencer l'achat
purchaseing = Acheter...
[it]
NETWORK_ERROR = Errore di rete
ERROR = In core cidice usato non ok
DATA_ILLEGAL = Dati non corretti
SANDBOX_OR_RESOURCE_EMPTY = Sandbox o elenco risorse vuoto
INIT_CFG_ERROR = Errore documenti impostazioni di inizializzazione
INIT_ACCOUNT_ERROR = Errore lista account inizializzazione
INIT_PAYMENT_ERROR = Errore di sistema pagamento inizializzazione
NOT_START_SYSTEM = Non è presente il sistema di avviamento
ALREADY_INIT_SYSTEM = Inizializzazione sistema avvenuta
PARSE_RESPONSE_ERROR = Errore risposta analisi
PARSE_INIT_INFO_ERROR = Errore dati inizializzazione analisi
PARSE_LOGIN_INFO_ERROR = Errore info accesso analisi
USERNAME_OR_PASSWORD_EMPTY = Nome utente o password vuoti
ACCOUNT_ID_OR_CODE_EMPTY = ID account o codice account vuoti
ACCOUNT_ALREADY_BIND_CHANNEL = Account già associato al canale attuale
PHONE_OR_CODE_EMPTY = Numero di telefono o codice di verifica vuoti
PHONE_NUMBER_EMPTY = Numero di telefono vuoto
PHONE_FORMAT_ERROR = Formato numero di telefono errato
QUICK_AUTH_TOKEN_EMPTY = Token permesso access rapido vuoto
NOT_SURE_ALL_INTERACTIVE = Non ancora confermata l’interazione di tutti i dialoghi
NOT_EXIST_SERVICE_DIALOG = Dialogo del servizio inesistente
ALREADY_LOGIN = Accesso già effettuato
LOGIN_FAILED = Accesso fallito
REMOVE_ACCOUNT_ERROR = Eliminazione account fallita
PAYMENT_ERROR = Errore pagamento
CREATE_LOCAL_ORDER_ERROR = Errore creazione ordine locale
EXIST_LOCAL_ORDER = È presente un ordine locale non completato
REMOVE_LOCAL_ORDER_ERROR = Errore rimozione ordine locale
NOT_IN_INIT = Al momento non si è nello stato di inizializzazione
NOT_IN_LOGIN = Al momento non si è nell stato di accesso
INIT_SYSTEM_ERROR = Errore inizializzazione di sistema
INIT_PREFERENCES_ERROR = Errore impostazioni preferite inizializzazione utente
EXIST_VIEW_NOT_CLOSE = È presente view non chiusa
CURRENT_VIEW_NOT_OPENED = View attuale non aperta
FETCH_DESC_FAILED = Fallimento descrizione errore fetch
NOT_EXIST_CHILD_ACCOUNT = Account secondario attuale inesistente
NAME_OR_IDENTITY_EMPTY = Nome o identità vuoti
ACCOUNT_NOT_EXIST=Info account inesistenti
ORDER_INFO_NOT_EXIST = Info ordine inesistenti
CHANNEL_NOT_SUPPORT_LOGIN = Accesso canale non supportato
NOT_SUPPORT_OPERATOR = Operazione attuale non supportata
PLEASE_RESTART_UPDATE = Aggiornamento completato, riavviare
LOCALIZATION_UPDATE_RESTART = Documento di localizzazione aggiornato, riavvia per attivare
CONFIGRATION_UPDATE_RESTART = Documento impostazioni aggiornato, riavvia per attivare
NOT_GENUINE_APP = Versione app non originale, scaricare versione ufficiale
CANCEL_REAL_NAME = Annulla verifica identità取消实名认证
UNOFFICIAL_AUTHENTICATION = Accesso non ufficiale
UNKNOWN = Errore sconosciuto
enterGame = Entra nel gioco
policyPrivacy = Leggi e approva [normativa sulla privacy] e [contratto utente]
otherLogin = Altri metodi di accesso
realAuth = Verifica identità
quickLogin = Accessi rapido
phoneQuickLogin=Accesso rapido con questo numero
pleaseInputPwd = Inserire password
pleaseInputAccount = Inserire account
getVerifyCode = Codice di verifica
pleaseInputVerifyCode = Inserire codice di verifica
pleaseInputPhone = Inserire numero di telefono
tip = Consiglio
authorization = Autorizzazione
cancel = Annulla
sure = Conferma
pleaseInputIdentifyId = Inserire numero documento d’identità
pleaseInputName = Inserire nome
realNameRules = In base alle nuove informazioni pubblicate in “Avviso sulla prevenzione della dipendenza da giochi on-line dei minori”, gli account con identità non identificata non possono accedere al gioco, registra la tua identità al più presto.
mainEnter = Entrata account principale
chileEnter = Emtrata account secondario
checkedPrivace = Metti la spunta per approvare le normative necessarie per accedere al gioco
checkPermissionTip = Dato che hai negato il permesso di %, per attivare questa funzione è necessario aprire “impostazioni”>“gestione permessi” e attivare il permesso
realNameError = Formato nome e cognome inseriti errato
idCardError = Il formato di documento d’identità che hai inserito non è corretto
phoneError = Formato numero di telefono errato
vcodeError = Formato codice di verifca errato
pwdError = Formato password errato
getVcodeFailed = Ottenimento codice di verifica fallito
bindAccount = Associa account
bindAccountTip = L’ospite non ha associato l’account canale attuale
guestAccountTip = L’account attuale è un account ospite, associa al più presto un account di terze parti, così da evitare la perdita dell’account
guestSwitchTip = Attualmente sei un account ospite. Cambiare account farà perdere i progressi di gioco dell'account ospite corrente.
bindingAccountTip = Account attuale già associato all’account %s
accountId = ID account
accountCode = Codice account
bindAccountIdPlaceholder = Inserire Id di recupero account
bindAccountCodePlaceholder = Inserire codice di recupero account
bindIdCodedescription = Quando si cambia dispositivo si possono inserire i seguenti id di recupero e codice di recupero nella pagina di cambio account, così si possono utilizzare i dati del personaggio dell’account originale e proseguire il gioco
unbindIdCodedescription = Se l’account non ha account di terze parti associate, si possono inserire l’id di recupero e il codice di recupero per passare all’account
switchAccountTip = L’account del canale dell’accesso attuale è già associato a un’altro account di gioco, effettuare il cambio?
switchAccount = Cambio account
switchAccountFailture = Cambio account fallito
sameAccountTip = Accesso account attuale effettuato
loginSuccessTip = Utente %s, accesso riuscito
orderValidate = Verifica ordine in corso...
startingPay = Inizia acquisto
purchaseing = Acquisto in corso...
[ja]
NETWORK_ERROR = ネットワークエラー
ERROR = core 内共通の非okコード
DATA_ILLEGAL = 不適切なデータ
SANDBOX_OR_RESOURCE_EMPTY = サンドボックスまたはリソースディレクトリが空です
INIT_CFG_ERROR = 構成ファイルの初期化にエラーが発生しました
INIT_ACCOUNT_ERROR = アカウントリストの初期化にエラーが発生しました
INIT_PAYMENT_ERROR =支払いシステムの初期化にエラーが発生しました
NOT_START_SYSTEM = システムが起動していません
ALREADY_INIT_SYSTEM = システムは初期化されました
PARSE_RESPONSE_ERROR = レスポンスの解析にエラーが発生しました
PARSE_INIT_INFO_ERROR = 初期化データの解析にエラーが発生しました
PARSE_LOGIN_INFO_ERROR = ログイン情報の解析にエラーが発生しました
USERNAME_OR_PASSWORD_EMPTY = ユーザー名またはパスワードが空です
ACCOUNT_ID_OR_CODE_EMPTY = アカウントIDまたアカウントコードが空です
ACCOUNT_ALREADY_BIND_CHANNEL = アカウントは既にこのチャンネルと連携されています
PHONE_OR_CODE_EMPTY = 携帯番号または認証コードが空です
PHONE_NUMBER_EMPTY = 携帯番号が空です
PHONE_FORMAT_ERROR = 携帯番号の形式が間違っています
QUICK_AUTH_TOKEN_EMPTY = クイックログインの認証Tokenが空です
NOT_SURE_ALL_INTERACTIVE = すべてのダイアログインタラクションは確認されていません
NOT_EXIST_SERVICE_DIALOG = 業務ダイアログは存在しません
ALREADY_LOGIN = ログイン済み
LOGIN_FAILED = ログイン失敗
REMOVE_ACCOUNT_ERROR = アカウントの削除に失敗しました
PAYMENT_ERROR = 支払いエラー
CREATE_LOCAL_ORDER_ERROR = ローカル注文の作成時にエラーが発生しました
EXIST_LOCAL_ORDER = 未完了のローカル注文があります
REMOVE_LOCAL_ORDER_ERROR = ローカル注文の削除時にエラーが発生しました
NOT_IN_INIT = 現在は初期化状態ではありません
NOT_IN_LOGIN = 現在はログイン状態ではありません
INIT_SYSTEM_ERROR = システムの初期化にエラーが発生しました
INIT_PREFERENCES_ERROR = ユーザーパーソナライズ設定の初期化にエラーが発生しました
EXIST_VIEW_NOT_CLOSE = 閉じられていないビューがあります
CURRENT_VIEW_NOT_OPENED = このビューは開いていません
FETCH_DESC_FAILED = エラーの説明の取得に失敗しました
NOT_EXIST_CHILD_ACCOUNT = このサブアカウントが存在しません
NAME_OR_IDENTITY_EMPTY = 名前または身分証明書が空です
ACCOUNT_INFO_NOT_EXIST = アカウント情報が存在しません
ORDER_INFO_NOT_EXIST = 注文情報が存在しません
CHANNEL_NOT_SUPPORT_LOGIN = チャンネルログインがサポートされていません
NOT_SUPPORT_OPERATOR = この操作がサポートされていません
PLEASE_RESTART_UPDATE = アップデートが完了しました。再起動してください
LOCALIZATION_UPDATE_RESTART = 国際化ファイルが更新されました。再起動すると有効になります。
CONFIGRATION_UPDATE_RESTART = 構成ファイルが更新されました。再起動すると有効になります。
NOT_GENUINE_APP = 正規版のアプリではありません。正規版をダウンロードしてください
CANCEL_REAL_NAME = 実名認証をキャンセルします
UNOFFICIAL_AUTHENTICATION = 非公式認証ログイン
UNKNOWN = 未知の異常
enterGame = ゲームに入る
policyPrivacy = [プライバシーポリシー]と[利用規約]を読んで同意します
otherLogin = その他のログイン方法
realAuth = 実名認証
quickLogin = クイックログイン
phoneQuickLogin=この携帯番号でクイックログイン
pleaseInputPwd = パスワードを入力してください
pleaseInputAccount = アカウントを入力してください
getVerifyCode = 認証コード
pleaseInputVerifyCode = 認証コードを入力してください
pleaseInputPhone = 携帯番号を入力してください
tip = チップス
authorization = 認証
cancel = キャンセル
sure = 確認
pleaseInputIdentifyId = 身分証明書番号を入力してください
pleaseInputName = 名前を入力してください
realNameRules = 国家新聞出版署の『未成年者のオンラインゲーム依存防止に関する通知』の要件に従って、実名認証されていないアカウントはゲームを体験することができません。速やかに実名登録を完了してください
mainEnter = メインアカウントで入る
chileEnter = サブアカウントで入る
checkedPrivace = ゲームにログインする前に、関連するポリシー条項を確認し、同意してください。
checkPermissionTip = %権限を拒否したため、この機能を有効にするには、「設定」 > 「権限管理」 を開いて許可する必要があります
realNameError = 入力した名前の形式が正しくありません
idCardError = 入力した身分証明書の形式が正しくありません
phoneError = 携帯番号の形式が正しくありません
vcodeError = 認証コードの形式が正しくありません
pwdError = パスワードの形式が正しくありません
getVcodeFailed = 認証コードの取得に失敗しました
bindAccount = アカウント連携
bindAccountTip = このチャンネルアカウントはゲストと連携されていません
guestAccountTip = 現在のアカウントはゲストアカウントです。アカウントを失わないよう、できるだけ早く第三者アカウントに連携してください
guestSwitchTip = あなたは現在ゲスト アカウントです。アカウントを切り替えると、現在のゲスト アカウントのゲームの進行状況が失われます
bindingAccountTip = 現在のアカウントは%sアカウントに連携されています
accountId = アカウントID
accountCode = アカウントコード
bindAccountIdPlaceholder = アカウント回復IDを入力してください
bindAccountCodePlaceholder = アカウント回復コードを入力してください
bindIdCodedescription = デバイスを変更した場合、アカウント切り替え画面で現在の回復IDと回復コードを入力すると、元のアカウントのキャラクターデータでゲームを継続することができます。
unbindIdCodedescription = アカウントが第三者アカウントに連携されていない場合は、アカウント回復IDと回復コードを入力することでアカウントを切り替えることができます。
switchAccountTip = 現在ログインしているチャンネルアカウントは別のゲストアカウントに連携されています。切り替えますか?
switchAccount = アカウント切り替え
switchAccountFailture = アカウントの切り替えに失敗しました
sameAccountTip = このアカウントはログインしています
loginSuccessTip = ユーザー%s、ログインに成功しました
orderValidate = 注文確認中...
startingPay = 購入を開始します
purchaseing = 購入中...
[pt]
NETWORK_ERROR = Erro de rede
ERROR = Código de erro geral das funções principais
DATA_ILLEGAL = Dados inválidos
SANDBOX_OR_RESOURCE_EMPTY = Não há recursos na pasta de recursos
INIT_CFG_ERROR = Ocorreu um erro ao inicializar o arquivo de configuração
INIT_ACCOUNT_ERROR = Ocorreu um erro ao inicializar a lista de contas
INIT_PAYMENT_ERROR = Ocorreu um erro ao inicializar o sistema de pagamento
NOT_START_SYSTEM = O sistema não foi inicializado
ALREADY_INIT_SYSTEM = O sistema foi inicializado
PARSE_RESPONSE_ERROR = Ocorre um erro ao analisar a resposta
PARSE_INIT_INFO_ERROR = Ocorre um erro ao analisar dados inicializados
PARSE_LOGIN_INFO_ERROR = Falha ao analisar as informações de login
USERNAME_OR_PASSWORD_EMPTY = Nome do usuário e senha devem ser preenchidos
ACCOUNT_ID_OR_CODE_EMPTY = ID da conta e código da conta devem ser preenchidos
ACCOUNT_ALREADY_BIND_CHANNEL = A conta já está vinculada ao canal atual
PHONE_OR_CODE_EMPTY = Número do celular e código de verificação devem ser preenchidos
PHONE_NUMBER_EMPTY = Número do celular deve ser preenchido
PHONE_FORMAT_ERROR = Formato do número de celular incorreto
QUICK_AUTH_TOKEN_EMPTY = A identidade do jogador não pode ser autorizado com bug de Token
NOT_SURE_ALL_INTERACTIVE = Todos os diálogos ainda não foram confirmados
NOT_EXIST_SERVICE_DIALOG = Não há diálogos de negócios
ALREADY_LOGIN = Já está logado
LOGIN_FAILED = Falha no login
REMOVE_ACCOUNT_ERROR = Falha ao excluir a conta
PAYMENT_ERROR = Erro de pagamento
CREATE_LOCAL_ORDER_ERROR = Criação do pedido local falhou
EXIST_LOCAL_ORDER = Há um pedido local pendente
REMOVE_LOCAL_ORDER_ERROR = Falha ao remover o pedido local
NOT_IN_INIT = O sistema ainda não foi inicializado
NOT_IN_LOGIN = Você ainda não fez login
INIT_SYSTEM_ERROR = Ocorreu um erro ao inicializar o sistema
INIT_PREFERENCES_ERROR = Ocorreu um erro ao inicializar a configuração de preferências do usuário
EXIST_VIEW_NOT_CLOSE = Tem View pendente
CURRENT_VIEW_NOT_OPENED = View Atual ainda não foi aberto
FETCH_DESC_FAILED = Falha ao obter as informações do erro
NOT_EXIST_CHILD_ACCOUNT = A conta secundária não existe
NAME_OR_IDENTITY_EMPTY = O nome e o número do RG devem ser preenchidos
ACCOUNT_INFO_NOT_EXIST = As informações da conta não foram encontradas
ORDER_INFO_NOT_EXIST = As informações do pedido não foram encontradas
CHANNEL_NOT_SUPPORT_LOGIN = Este canal não suporta login
NOT_SUPPORT_OPERATOR = A operação atual não é suportada
PLEASE_RESTART_UPDATE = A atualização foi concluída. Reinicie o aplicativo
LOCALIZATION_UPDATE_RESTART = Atualização do arquivo de internacionalização concluída. Reinicie o aplicativo para ver as alterações
CONFIGRATION_UPDATE_RESTART = Atualização do arquivo de configuração concluída. Reinicie o aplicativo para ver as alterações
NOT_GENUINE_APP = Aplicativo duvidoso, baixe aplicativo de confiança
CANCEL_REAL_NAME = Cancelar a verificação do nome real
UNOFFICIAL_AUTHENTICATION = Método de login inválido
UNKNOWN = Erro desconhecido
enterGame = Entrar
policyPrivacy = Li e aceito a [Política de Privacidade] e o [Contrato do Usuário]
otherLogin = Outros métodos de login
realAuth = Verificação do nome real
quickLogin = Login rápido
phoneQuickLogin=Login rápido com número do celular local
pleaseInputPwd = Insira a senha
pleaseInputAccount = Insira a conta
getVerifyCode = Código de verificação
pleaseInputVerifyCode = Insira o código de verificação
pleaseInputPhone = Insira o número do celular
tip = Dica
authorization = Autorização
cancel = Cancelar
sure = Confirmar
pleaseInputIdentifyId = Insira seu número do RG
pleaseInputName = Insira seu nome
realNameRules = Conforme os requisitos do “Aviso para Impedir que Menores de Idade Joguem Online” publicado pela Administração Nacional de Imprensa e Publicação, os usuários não verificados não podem experimentar esse jogo. Por favor, conclua o registro do nome real o mais rápido possível
mainEnter = Entrar com conta principal
chileEnter = Entrar com conta secundária
checkedPrivace = Marque e aceite os termos da política antes de entrar no jogo
checkPermissionTip = Como você não autorizou a permissão de %, para ativar essa função, é necessário abrir “Configurações” > “Gerenciamento de permissões” e autorizar
realNameError = Você inseriu o nome em um formato incorreto
idCardError = Você inseriu o número do RG em um formato incorreto
phoneError = Formato do número de celular incorreto
vcodeError = Formato do código de verificação incorreto
pwdError = Formato da senha incorreto
getVcodeFailed = Falha ao obter o código de verificação
bindAccount = Vincular conta
bindAccountTip = A conta atual deste canal ainda não vincula um convidado
guestAccountTip = A conta atual é uma conta de convidado. Vincule a conta de terceiros o mais rápido possível para evitar a perda da conta
guestSwitchTip = Você é atualmente uma conta de convidado. Ao trocar de conta, você perderá o progresso do jogo da conta de convidado atual
bindingAccountTip = A conta atual já está vinculada à conta %s
accountId = ID da conta
accountCode = Código da conta
bindAccountIdPlaceholder = Insira o ID de recuperação da conta
bindAccountCodePlaceholder = Insira o código de recuperação da conta
bindIdCodedescription = Se você trocar de dispositivo, não se preocupe! Basta inserir o ID de recuperação e o código de recuperação atuais na página de troca de conta. Assim, você poderá continuar jogando com os dados de personagem da conta original
unbindIdCodedescription = Se você não estiver vinculado a nenhuma conta de terceiros, você poderá inserir o ID de recuperação da conta e o código de recuperação para trocar de conta
switchAccountTip = A conta deste canal que está usando agora já está vinculada a outra conta de convidado. Deseja trocar de conta?
switchAccount = Trocar de conta
switchAccountFailture = Falha ao trocar de conta
sameAccountTip = A conta atual está logada
loginSuccessTip = Usuário %s fez login com sucesso
orderValidate = Verificando pedido...
startingPay = Começar a comprar
purchaseing = Comprando...
[system]
TIMESTAMPT = 1701326040
background_color_view = DFE0E5
button_background_default_color = 008CD6
button_background_unable_color = CFCFD1
button_background_pressed_color = 009FEC
button_background_color = 008CD6
button_border_color = D80020
label_font_color = D80020
{
"accessDomainSign":"cfC0wG/8ffRLnAGCANdv03kKHLNLvD4bu0WYuoIIJ3LbGgRNJ6ogD0dZFHpcxK0KXhuGXLUg26ia9HNScreiIwICv+NnZ9tuVCjDMtT12GHOD527EpqrWaXhbj+kcXFkRoWW895lNFeZqjshbdOKEE/xRTKcta1SEVLgaTvXlpQNxZiFtNgEkm1XJKjy5squxh+fJad9BfdYaynaZAVJOeEQ795rHO/k/YfssZqa11/TMlcRdQis49MsYrSEqU2JvjwdbVPQYeb9A09jO7UKJPMNui3v6bMiteqSR3MD5DI4biZcQUfs5zESLwvFXNdGK+chaauNpizXfF1vADFzMQ==",
"accessOpenApiUrl":"http://global.hoolai.com/access_open_api",
"biCollectionApiUrl":"http://overseascollect.hoolai.com/tracking/",
"buildPackageId":1,
"channelInfo":{
"betaType":0,
"biSwitch":"true",
"channel":"hoolai_global",
"channelName":"Access2.0",
"customHost":"",
"description":"",
"extendInfo":"{\"rsaPublicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnVHxEG9YBnFnMgldw9ekme/8Jv4FdUdW3lAj7lDkd9IbwxqZ9P0RlXkSe6Pk3TUtdc6ZfiSEaYmORid+34+7L3pcgofWVQrX8fNlRiOYSrvbH1PIxSlhZPHdVf8Ovju2MzQDP0VZ1wzsvON2QVytHhqTAd4nJ5sDxvI2LvjvuDCrWf/TTRnSHRO1XLgtvw35M4mhcrNor4tvtccqh1blU8i5HoAIoQJfR+uWdXhGAbyK1iho5pTg12atMF1R6D8cmCCC056I9ONs85tWAsR5S2mKHAgl8U6HRZNT1pAb4KTUMBEQJB6Kf9Cak5NkGQlGg1KrVi60MVefGjWLukTKxQIDAQAB\",\"showIGameBuyPay\":false,\"showTT\":false,\"customText\":false,\"appsflyer_debug\":\"false\",\"showGG\":false,\"showmol\":false,\"showAihelp\":false,\"showUnipinPay\":false,\"showCatappultPay\":false,\"updateService\":\"1\",\"showhw\":false,\"showPaypalH5Pay\":false,\"showFBL\":false,\"showFW\":true,\"showPaypalPay\":false,\"oaidCertPem\":\"\",\"smileoneTest\":true,\"showJollyMaxH5Pay\":false,\"showIGameBuyWebPay\":false,\"showPagsmileH5Pay\":false,\"showYJM\":true,\"paypalH5Test\":true,\"adjust_debug\":\"false\",\"showGL\":true,\"vklType\":1,\"enablePgs\":true,\"adjustDebug\":false,\"paypalTest\":true,\"privacyAgreementUrl\":\"\",\"showSmileOneH5Pay\":false,\"showxl\":false,\"oaidAccess\":\"0\",\"isSandBox\":\"1\",\"uitype\":\"hoolai\",\"facebookNeedEmail\":false,\"googleClientId\":\"242883477374-7u4f0fvqg2a6jrd7ro6sat6ms2ledtml.apps.googleusercontent.com\",\"showCodashopPay\":false,\"showbp\":false,\"showmycard\":false,\"userPrivaceAgreementUrl\":\"\",\"showMobPay\":false,\"pgsProjectId\":\"111\",\"vkAppId\":\"0\",\"sdkType\":true,\"showcoda\":false,\"showGooglePay\":true,\"pagsmileTest\":true,\"privacyAgreement\":\"-1\",\"jollymaxTest\":true,\"showPayermaxH5Pay\":false}",
"fzSwitch":"false",
"icon":"/2023/07/21/fff3ef16-421b-4f74-8c3f-e52bfe3fa820.png",
"id":6403,
"newreyunAdAppid":"",
"nodeId":0,
"packageName":"com.hoolai.oversea.access",
"payClose":false,
"productId":6,
"registerClose":false,
"reyunAppid":"",
"reyunSwitch":"false",
"signId":415,
"userHttps":false,
"webUrl":""
},
"chargeDomainSign":"cfC0wG/8ffRLnAGCANdv03kKHLNLvD4bu0WYuoIIJ3LbGgRNJ6ogD0dZFHpcxK0KXhuGXLUg26ia9HNScreiIwICv+NnZ9tuVCjDMtT12GHOD527EpqrWaXhbj+kcXFkRoWW895lNFeZqjshbdOKEE/xRTKcta1SEVLgaTvXlpQNxZiFtNgEkm1XJKjy5squxh+fJad9BfdYaynaZAVJOeEQ795rHO/k/YfssZqa11/TMlcRdQis49MsYrSEqU2JvjwdbVPQYeb9A09jO7UKJPMNui3v6bMiteqSR3MD5DI4biZcQUfs5zESLwvFXNdGK+chaauNpizXfF1vADFzMQ==",
"chargeOpenApiUrl":"http://global.hoolai.com/charge_open_api",
"clientLogUrl":"http://global.hoolai.com/client_log",
"community_back":"http://community.hoolai.com/community_open_api",
"community_front":"http://community.hoolai.com/community_frontend",
"customGameid":"",
"customServiceApiUrl":"http://api.kf.hulai.com/v1/",
"developerUid":22633,
"forumOpenApiUrl":"http://global.hoolai.com/community_web",
"iconPosition":0,
"iosUpdateCDNUrl":"http://iossdkupdate-10009868.file.myqcloud.com",
"localType":"oversea",
"notifyUrl":"http://global.hoolai.com/charge_open_api/validate_hoolai_global.hl",
"productId":6,
"single":false,
"snid":300,
"targetSdkVersion":29,
"tripartitleAccount":{
"androidCstAppId":"qqq",
"androidCstAppKey":"www",
"androidXgAppid":"2100076124",
"androidXgAppkey":"A3H6E4YW55ZA",
"fzDebug":"0",
"iosBuglyAppid":"900003937",
"iosCstAppId":"qq",
"iosCstAppKey":"qq",
"iosXgAppid":"2200140989",
"iosXgAppkey":"IY56MQ4PX69H",
"uid":"22633"
},
"useBugly":true,
"useCustomerService":false,
"usePush":false,
"userService":false,
"version":"1"
}
\ No newline at end of file
Nylq2KwJc9zyQHHorv7V1k9OQlVmZRldJ7pYyX3SBh0n80IkSOshbI1GpwwpPnfN1pIzICsQe8SNodtNxtOFo+5+2GwSop3KQ9L8huM6Q+uLvbmV77hS+lHX9l3c4qqsgUqC/V8hTAWVFMNCCwjYZX5FZsPrsjsaimPJita5FoC5Xakapt5bP9fEf/t5eetVFxQRTCaU1kJvbaZc0lyP9IDEabEAgbecqx6ldQQxfucII8s2L/61ZosgzoGRuCizpNTyRotsLyeRJCDZup1MK8k2NqwngizHcndiAPi71cUSdoZN8HSCkruPvlIpVPE9hNE/1dx65rQSCuabsvKeHA==
\ No newline at end of file
版本:v3.3.3_google
更新时间:2023-10-25
package com.hoolai.demo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hoolai.access.log.LogUtils;
import com.hoolai.demo.share.FacebookShareActivity;
import com.hoolai.demo.share.ShareActivity;
import com.hoolai.demo.utils.DataReportUtil;
import com.hoolai.fastsdk.demo.R;
import com.hoolai.open.fastaccess.channel.ExitCallback;
import com.hoolai.open.fastaccess.channel.FastSdk;
import com.hoolai.open.fastaccess.channel.InitCallback;
import com.hoolai.open.fastaccess.channel.PayCallback;
import com.hoolai.open.fastaccess.channel.PayParams;
import com.hoolai.open.fastaccess.channel.UserExtDataKeys;
import com.hoolai.open.fastaccess.channel.UserLoginResponse;
import com.hoolai.open.fastaccess.channel.callback.CommonCallback;
import com.hoolai.open.fastaccess.channel.callback.LoginCallback;
import com.hoolai.open.fastaccess.channel.callback.PayProduct;
import com.hoolai.open.fastaccess.channel.callback.ProductCallback;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class GameActivity extends Activity implements View.OnClickListener {
public static final String TAG = "fastaccessGameDemo";
Button gameLoginBtn;
Button LanguageBtn;
private String msg;
private String callbackInfo = "0|6867485|nw_001";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//SysUtil.setFuLLScreen(this);
setContentView(R.layout.hl_demo_login);
initData();
}
/**
* 设置回调信息
*/
private void initData() {
//设置初始化回调
InitCallback initCallback = new InitCallback() {
@Override
public void onInitSuccess(String s) {
LogUtils.e("初始化成功:" + FastSdk.getChannelInfo().getInitParams());
//sdk初始化成功
//成功回调信息为json串,其中包含channel、biChannel,channelId和productId
//注意此时返回的channel不能用于server端登录验证时的channel,登录验证使用的是登录成功后回调的channel值
setLoginCallback();
paintLogin();
// funCode = 120(信鸽初始化,只有此功能必接,其他信鸽功能选接)
if (FastSdk.hasFunctionCode(120)) {
FastSdk.invokeSpecialFunction(120, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
if (objects[0] instanceof org.json.JSONObject) {
JSONObject result = (JSONObject) objects[0];
}
}
});
}
}
@Override
public void onInitFail(String s) {
//sdk初始化失败,初始化失败不能调用FastSdk其他接口
}
};
FastSdk.onCreate(this, initCallback);
// // 获取当前SDK版本号接口
String sdkVersion = FastSdk.getSdkVersion();
//Log.i(AbstractChannelInterfaceImpl.TAG, "当前SDK版本号:" + sdkVersion);
}
/**
* 设置登录回调
*/
private void setLoginCallback() {
FastSdk.setLoginCallback(new LoginCallback() {
@Override
public void onLoginFailed(String s) {
// onLoginFailed 登录失败(取消登录框)回调,并不是每个渠道都会有这个回调,所以建议在登录界面上放一个登陆按钮。
//避免取消登录框以后无法登录的情况。
Log.d(TAG, "登陆失败:" + s);
}
@Override
public void onLoginSuccess(UserLoginResponse userLoginResponse) {
LogUtils.e(TAG, "登陆成功:" + JSON.toJSONString(userLoginResponse));
try {
//模拟报送数据
sendDataReport(userLoginResponse);
// 自定义指标打点报送
//userExtData.put(UserExtDataKeys.ACTION, "zdy");
//userExtData.put(UserExtDataKeys.PHYLUM, "5");
//userExtData.put(UserExtDataKeys.CLASSFIELD, "zdy555");
//FastSdk.setUserExtData(GameActivity.this, userExtData);
//渠道登录成功
Integer productId = FastSdk.getChannelInfo().getProductId();
String accessToken = userLoginResponse.getAccessToken();
Long uid = userLoginResponse.getUid();//接入平台的用户id
//channel对应的各渠道值查询http://access.hoolai.com/access_web/channelEnumList.do
String channel = userLoginResponse.getChannel();//渠道
String channelUid = userLoginResponse.getChannelUid();//渠道的用户id
//将以上参数,传给产品的服务器端, 产品的服务器端去接入平台的服务器去验证当前用户登录是否有效,
//参考服务端接入http://access.hoolai.com/doc/2016/02/16/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A5%E5%8
String name = userLoginResponse.getNickName();
Integer channelId = FastSdk.getChannelInfo().getId();
String biChannel = FastSdk.getChannelInfo().getBiChannel();
// String udid = AccessHttpService.getUDID();
// 如果是YSDK渠道,判断是QQ还是微信登录
if (FastSdk.getChannelInfo().getChannel().equals("hoolaiysdk")) {
Boolean isQQ = (Boolean) userLoginResponse.getExtendInfo().get("isQQ");
}
// 如果是胡莱官网渠道
if (FastSdk.getChannelInfo().getChannel().equals("hoolai")) {
Boolean isBindPhone = (Boolean) userLoginResponse.getExtendInfo().get("isBindPhone");
Boolean isBindEmail = (Boolean) userLoginResponse.getExtendInfo().get("isBindEmail");
}
msg = "hoolai_uid:" + uid + "\n名称:" + name + "\n产品ID:" + productId + "\n渠道ID:" + channelId + "\nchannelUid:" + channelUid + "\nchannel:" + channel
+ "\nbiChannel:" + biChannel + "\nUDID:" ;//+ udid;
// 验证通过进入游戏
paintGame();
} catch (Exception e) {
Log.e(TAG, "验证access出现异常", e);
}
}
@Override
public void onLogout(Object... objects) {
//登出回调逻辑请重点关注,这里是接入完成以后,测试的时候最容易出问题的地方
//调用FastSdk.logout(this,null)会触发该回调方法
//某些sdk的浮标里有切换账号 注销账号的时候也会调用该接口
//这里请不要直接调用sdk的login接口
//渠道要求在游戏运行的任何时刻均可正常登出帐号,所以游戏需要具备完善的登出逻辑,
//当收到渠道或者游戏自己的切换帐号或登出通知时,能中断游戏逻辑,清空游戏角色信息,返回登录界面,供用户切换其他帐号登录。
//登出逻辑属于用户系统逻辑,认为随着游戏SDK的不断成熟,未来渠道均会提供切换帐号或登出逻辑。
//目前有悬浮窗的渠道大部分会在悬浮窗中提供切换帐号功能,但剩余的渠道有部分仍需游戏自己处理,
//所以强烈建议游戏中添加登出或切换帐号的按钮。
paintLogin();
}
});
}
private void sendDataReport(UserLoginResponse userLoginResponse) {
try {
Map<String, String> userExtData = new HashMap<String, String>();
userExtData.put(UserExtDataKeys.ROLE_ID, userLoginResponse.getChannelUid());
userExtData.put(UserExtDataKeys.ROLE_NAME, userLoginResponse.getChannelUid());
userExtData.put(UserExtDataKeys.ROLE_LEVEL, "1");
userExtData.put(UserExtDataKeys.ROLE_ID, "11182");
userExtData.put(UserExtDataKeys.PARTYNAME, "同福碗粥");
userExtData.put(UserExtDataKeys.BALANCE, "0");
userExtData.put(UserExtDataKeys.VIP, "0");
userExtData.put(UserExtDataKeys.ZONE_ID, "1");
userExtData.put(UserExtDataKeys.ZONE_NAME, "1区-雄霸天下");
//基础打点报送模拟
DataReportUtil.basisData(this, userExtData);
//af_开头打点报送模拟
DataReportUtil.afDataSend(this, userExtData);
//普通扩展数据模拟报送
DataReportUtil.DataSend(this, userExtData);
} catch (Exception e) {
LogUtils.e("report Data send Exception:" + e.getMessage());
}
}
/**
* 启动登录界面
*/
private void paintLogin() {
setContentView(R.layout.hl_demo_login);
gameLoginBtn = (Button) findViewById(R.id.gameLoginBtn);
gameLoginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 调用SDK登录功能
FastSdk.login(GameActivity.this, null);
}
});
LanguageBtn = (Button) findViewById(R.id.gameLanguageBtn);
LanguageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 国际化设置语言
final Map<String, String> supportLanguages = FastSdk.getSupportLanguages(GameActivity.this);
// LogUtils.i(JSON.toJSONString(supportLanguages));
final String[] items = new String[supportLanguages.size()];
int index = 0;
for (Map.Entry<String, String> e : supportLanguages.entrySet()) {
items[index++] = e.getKey() + "--" + e.getValue();
}
new AlertDialog.Builder(GameActivity.this)
.setTitle("语言切换")
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String item = items[i];
FastSdk.switchLanguage(GameActivity.this, item.split("--")[0]);
}
}).show();
}
});
}
/**
* 启动游戏主界面
*/
private void paintGame() {
this.setContentView(R.layout.hl_demo_game);
TextView textView = (TextView) this.findViewById(R.id.showMessage);
textView.setText(msg);
this.findViewById(R.id.btnCopy).setOnClickListener(this);
this.findViewById(R.id.btnCallbackLength).setOnClickListener(this);
this.findViewById(R.id.btnCallbackText).setOnClickListener(this);
this.findViewById(R.id.btnGetMetaData).setOnClickListener(this);
this.findViewById(R.id.btnGetBalance).setOnClickListener(this);
this.findViewById(R.id.btnEnterPay).setOnClickListener(this);
this.findViewById(R.id.btnLogout).setOnClickListener(this);
this.findViewById(R.id.btnExitSDK).setOnClickListener(this);
this.findViewById(R.id.btnOpenService).setOnClickListener(this);
this.findViewById(R.id.crash).setOnClickListener(this);
this.findViewById(R.id.anr).setOnClickListener(this);
this.findViewById(R.id.error).setOnClickListener(this);
findViewById(R.id.btnGetSpecialFuncCodes).setOnClickListener(this);
findViewById(R.id.btnInvokeSpecialFunc).setOnClickListener(this);
findViewById(R.id.btnFbShare).setOnClickListener(this);
Button btnAccountManage = (Button) this.findViewById(R.id.btnAccountManage);
if (FastSdk.hasAccountManage()) {
btnAccountManage.setVisibility(View.VISIBLE);
btnAccountManage.setOnClickListener(this);
} else {
btnAccountManage.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btnCopy) {// 复制
copyClipboard(msg);
} else if (id == R.id.btnCallbackLength) {
setGameCallback();
} else if (id == R.id.btnCallbackText) {
setGameCallbackText();
} else if (id == R.id.btnOpenService) {
//打开客服(可选)
FastSdk.customerService(this);
} else if (id == R.id.btnGetMetaData) {
getMetaData();
} else if (id == R.id.btnEnterPay) {// 定额支付
getProductInfo();
} else if (id == R.id.btnExitSDK) {// 退出游戏
exit();
} else if (id == R.id.btnGetSpecialFuncCodes) {
getSpecialFuncCodes();
} else if (id == R.id.btnInvokeSpecialFunc) {
invokeSpecialFun();
} else if (id == R.id.btnAccountManage) {// 账号管理
FastSdk.accountManage(GameActivity.this, null);
} else if (id == R.id.btnLogout) {
FastSdk.logout(this, "");
} else if (id == R.id.btnFbShare) {
startActivity(new Intent(this, ShareActivity.class));
} else if (id == R.id.crash) {
int b = 100 / 0;
int a = 1 / 0;
LogUtils.i("崩溃异常");
} else if (id == R.id.anr) {
try {
Thread.sleep(100000);
startActivity(new Intent(this, FacebookShareActivity.class));
LogUtils.i("出现ANR");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (id == R.id.error) {
try {
int a = 2 / 0;
} catch (Exception e) {
FastSdk.crashReport(this, e);
LogUtils.i("捕捉异常");
e.printStackTrace();
}
}
}
/**
* 特殊功能吗调用
*/
private void invokeSpecialFun() {
final EditText numberText = new EditText(GameActivity.this);
numberText.setInputType(android.text.InputType.TYPE_CLASS_NUMBER);
numberText.setHint("FunctionCode");
// com.google.android.gms.measurement.PackageMeasurementTaskService
// com.google.android.gms.clearcut.uploader.QosUploaderService
new AlertDialog.Builder(GameActivity.this).setTitle("请输入功能码").setIcon(android.R.drawable.ic_dialog_info).setView(numberText)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String moneyStr = numberText.getText().toString();
if (TextUtils.isEmpty(moneyStr)) {
Toast.makeText(GameActivity.this, "请输入功能码", Toast.LENGTH_SHORT).show();
return;
}
int funCode = Integer.parseInt(moneyStr);
specialInvoke(funCode);
}
}).setNegativeButton("取消", null).show();
}
/**
* 查看该渠道都有那些特殊功能
*/
private void getSpecialFuncCodes() {
for (Map.Entry<Integer, String> entry : FastSdk.getSpecialFunctionCodes().entrySet()) {
LogUtils.w("FunctionCode=" + entry.getKey() + ",Desc=" + entry.getValue());
Toast.makeText(GameActivity.this, "FunCode=" + entry.getKey() + ",Desc=" + entry.getValue(), Toast.LENGTH_SHORT).show();
}
}
/**
* 获取商品信息
*/
private void getProductInfo() {
//TODO:注意此处回调在子线程,如需操作UI界面需要切换线程
FastSdk.getProductInfo(null, new ProductCallback() {
@Override
public void onProductInfo(final List<PayProduct> list) {
final List<String> arrayList = new ArrayList();
for (PayProduct payProduct : list) {
arrayList.add(JSON.toJSONString(payProduct));
}
LogUtils.i("Demo收到的商品信息返回arrayList:" + arrayList.toString());
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
ListView listView = new ListView(GameActivity.this);
listView.setAdapter(new ArrayAdapter(GameActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, arrayList));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Toast.makeText(MainActivity.this,"你点击了支付"+position,Toast.LENGTH_SHORT).show();
String payInfo = (String) arrayList.get(position);
PayProduct payProduct = JSONObject.parseObject(payInfo, PayProduct.class);
PayParams payParams = new PayParams();
payParams.setItemId(payProduct.getItemId());
payParams.setItemName(payProduct.getPriceTag());
payParams.setAmount(Integer.parseInt(payProduct.getPrice()));
payParams.setCount(1);
payParams.setCallbackInfo(callbackInfo + "支付扩展信息");
payParams.addExtendParam("isSupportThirdPayment", "true");
payParams.addExtendParam("payType", "1");
payParams.addExtendParam("currency", payProduct.getPriceLocal());
FastSdk.pay(GameActivity.this, payParams, new PayCallback() {
@Override
public void onSuccess(String s) {
LogUtils.i("Demo 提示:支付成功");
Toast.makeText(GameActivity.this, "Demo 提示:支付成功" + s, Toast.LENGTH_SHORT).show();
}
@Override
public void onFail(String s) {
LogUtils.i("Demo 提示:支付失败");
Toast.makeText(GameActivity.this, "Demo 提示:支付失败" + s, Toast.LENGTH_SHORT).show();
}
});
}
});
builder.setView(listView);
builder.show();
}
});
}
@Override
public void onFail(String str) {
Context context = GameActivity.this;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("商品列表获取失败:");
stringBuilder.append(str);
Toast.makeText(context, stringBuilder.toString(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 获取声明在AndroidManifest.xml中meta标签中value值,注意value为数字获取为空
*/
private void getMetaData() {
final EditText et = new EditText(GameActivity.this);
et.setHint("请输入Key");
new AlertDialog.Builder(GameActivity.this).setTitle("请输入").setView(et).setPositiveButton("获取", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String key = et.getText().toString();
if (TextUtils.isEmpty(key)) {
Toast.makeText(GameActivity.this, "请输入Key", Toast.LENGTH_SHORT).show();
return;
}
String result = FastSdk.getMetaDataConfig(GameActivity.this, key);
Toast.makeText(GameActivity.this, result, Toast.LENGTH_SHORT).show();
}
}).show();
}
/**
* 设置回调内容
*/
private void setGameCallbackText() {
final EditText numberText = new EditText(GameActivity.this);
numberText.setInputType(android.text.InputType.TYPE_CLASS_TEXT);
numberText.setHint("回调信息");
numberText.setText(callbackInfo);
new AlertDialog.Builder(GameActivity.this).setTitle("请输入").setIcon(android.R.drawable.ic_dialog_info).setView(numberText)
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String str = numberText.getText().toString();
if (TextUtils.isEmpty(str)) {
return;
}
callbackInfo = str;
}
}).setNegativeButton("取消", null).show();
}
/**
* 设置支付回调
*/
private void setGameCallback() {
final EditText numberText = new EditText(GameActivity.this);
numberText.setInputType(android.text.InputType.TYPE_CLASS_NUMBER);
numberText.setHint("回调信息长度");
numberText.setText("" + callbackInfo.length());
new AlertDialog.Builder(GameActivity.this).setTitle("请输入").setIcon(android.R.drawable.ic_dialog_info).setView(numberText)
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String str = numberText.getText().toString();
if (TextUtils.isEmpty(str)) {
return;
}
String result = "A";
for (int i = 1; i < Integer.parseInt(str); i++) {
result += new Random().nextInt(10);
}
callbackInfo = result;
}
}).setNegativeButton("取消", null).show();
}
/**
* 复制到粘贴板
*
* @param msg
*/
private void copyClipboard(String msg) {
ClipboardManager cmb = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cmb.setText(msg);
Toast.makeText(GameActivity.this, "成功复制到剪切板!", Toast.LENGTH_SHORT).show();
}
/**
* 渠道特殊功能码调用
*
* @param funCode
*/
private void specialInvoke(int funCode) {
/**
* 华为三方绑定
*/
if (FastSdk.getChannelInfo().getChannel().equals("huawei")) {
if (FastSdk.hasFunctionCode(funCode)) {
FastSdk.invokeSpecialFunction(funCode, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
String msg = "";
if (objects[0] instanceof String) {
msg = (String) objects[0];
}
Toast.makeText(GameActivity.this, "绑定结果:" + i + ",b:" + b + ", msg:" + msg, Toast.LENGTH_SHORT).show();
}
});
}
}
/**
* 冰鸟
*/
if (FastSdk.getChannelInfo().getChannel().equals("bnoversea")) {
FastSdk.invokeSpecialFunction(funCode, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
if (i == 121) {
if (b) {
Toast.makeText(GameActivity.this, "安卓冰鸟海外邮箱绑定成功!", Toast.LENGTH_SHORT).show();
} else if (objects != null) {
Toast.makeText(GameActivity.this, "安卓冰鸟海外万能接口接入错误,请检查!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(GameActivity.this, "安卓冰鸟海外邮箱绑定失败!", Toast.LENGTH_SHORT).show();
}
}
if (i == 122) {
if (b) {
Toast.makeText(GameActivity.this, "安卓冰鸟海外fb share成功!", Toast.LENGTH_SHORT).show();
} else if (objects != null) {
Toast.makeText(GameActivity.this, "安卓冰鸟海外万能接口接入错误,请检查!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(GameActivity.this, "安卓冰鸟海外fb share失败!", Toast.LENGTH_SHORT).show();
}
}
}
});
}
//信鸽推送
if (FastSdk.hasFunctionCode(funCode)) {
FastSdk.invokeSpecialFunction(funCode, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
String msg = "";
if (objects[0] instanceof String) {
msg = (String) objects[0];
}
LogUtils.i("信鸽调用类型:" + funCode);
LogUtils.i("信鸽调用结果:" + msg);
}
});
}
//Aihelp自定义导入数据到CRM系统(非必接)
if (FastSdk.hasFunctionCode(funCode)) {
Map<String, String> userExtData = new HashMap<String, String>();
userExtData.put("ROLE_ID", "123123");
userExtData.put("ROLE_NAME", "J");
userExtData.put("SERVER_ID", "101");
userExtData.put("VIP", "15");
userExtData.put("ROLE_LEVEL", "200");
userExtData.put("ZONE_NAME", "基地1");
userExtData.put("BALANCE", "10");
Boolean importCrm = true;//是否导入Ai-help CRM系统,ture导入,false不导入
FastSdk.invokeSpecialFunction(funCode, userExtData, importCrm);
}
}
private void doPay(int amount, String itemName, String itemId) {
// 调用SDK支付功能
PayParams payParams = new PayParams();
payParams.setItemId(itemId);
payParams.setItemName(itemName);
payParams.setAmount(amount);
payParams.setCount(123);
payParams.setCallbackInfo(callbackInfo);
//payParams.addExtendParam(PayParams.NOTIFY_URL_KEY, "http://a.b.com");//游戏自定义支付回调地址,不设置默认使用后台配置
payParams.addExtendParam("isSupportThirdPayment", "false");//是否显示三方支付 true显示 false不显示
FastSdk.pay(GameActivity.this, payParams, new PayCallback() {
@Override
public void onSuccess(String param) {
//支付成功后,该回调不能用作判定支付成功,只能判定支付客户端行为完成
//支付是否成功要以服务端回调为准
}
@Override
public void onFail(String param) {
//有可能是支付失败,取消支付界面等情况
//支付失败(取消支付框回调)回调,并不是每个渠道都会有这个回调,所以建议不要完全依赖该回调实现一些功能。
//(例如只有收到支付失败回调才会关闭loding框或者蒙板,这样会导致一些渠道会有问题)
}
});
}
private void exit() {
// 调用SDK退出功能
FastSdk.exit(GameActivity.this, null, new ExitCallback() {
@Override
public void onExitSuccess(String s) {
// 渠道存在退出界面,如91、360等,此处只需进行退出逻辑即可,无需再弹游戏退出界面
// 实现退出逻辑,请勿直接照搬demo
// System.exit(0);
moveTaskToBack(true);
finish();
// // 退出程序
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
// FastSdk.exit();
}
@Override
public void onCustomExit(final String s) {
// 渠道不存在退出界面,如百度移动游戏等,此时需在此处弹出游戏退出确认界面,否则会出现渠道审核不通过情况
// 游戏实现自己的退出界面 ,实现退出逻辑,请勿直接照搬demo
// 根据需要加二次确认框
new AlertDialog.Builder(GameActivity.this).setTitle("游戏二次确认").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onExitSuccess(s);
}
}).setCancelable(false).show();
}
});
}
@Override
protected void onStart() {
super.onStart();
FastSdk.onStart(this);
}
@Override
protected void onRestart() {
super.onRestart();
FastSdk.onRestart(this);
}
@Override
protected void onResume() {
super.onResume();
FastSdk.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
FastSdk.onPause(this);
}
@Override
protected void onStop() {
super.onStop();
FastSdk.onStop(this);
}
@Override
protected void onDestroy() {
try {
super.onDestroy();
FastSdk.onDestroy(this);
} catch (Exception e) {
Log.e(TAG, "onDestroy occured exception", e);
}
// funCode = 120(信鸽初始化,如果使用信鸽功能只有此功能必接,其他信鸽功能选接)
if (FastSdk.hasFunctionCode(120)) {
FastSdk.invokeSpecialFunction(120, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
if (objects[0] instanceof org.json.JSONObject) {
JSONObject result = (JSONObject) objects[0];
}
}
});
}
// funCode = 121(XG更新标签)
if (FastSdk.hasFunctionCode(121)) {
String[] addTags = {"tag1", "tag2"};//要添加的标签
FastSdk.invokeSpecialFunction(121, (Object) addTags);
}
// funCode = 122(XG删除标签)
if (FastSdk.hasFunctionCode(122)) {
String[] delTags = {"tag1", "tag2"};//要删除的标签
FastSdk.invokeSpecialFunction(122, (Object) delTags);
}
// funCode = 123(XG查询标签)
if (FastSdk.hasFunctionCode(123)) {
FastSdk.invokeSpecialFunction(123, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
if (objects[0] instanceof String) {
String result = (String) objects[0];
}
}
});
}
// funCode = 124(XG清空标签)
if (FastSdk.hasFunctionCode(124)) {
FastSdk.invokeSpecialFunction(124);
}
// funCode = 125(XG取消推送)
if (FastSdk.hasFunctionCode(125)) {
FastSdk.invokeSpecialFunction(125);
}
// funCode = 126(XG上传日志)
if (FastSdk.hasFunctionCode(126)) {
FastSdk.invokeSpecialFunction(126);
}
// funCode = 127(XG获取token)
if (FastSdk.hasFunctionCode(127)) {
FastSdk.invokeSpecialFunction(127, new CommonCallback() {
@Override
public void process(int i, boolean b, Object... objects) {
if (objects[0] instanceof String) {
String token = (String) objects[0];
}
}
});
}
// funCode = 128(XG设置CRM用户信息)
if (FastSdk.hasFunctionCode(128)) {
Map<String, String> map = new HashMap<>();
Boolean importCrm = true;
FastSdk.invokeSpecialFunction(128, map, importCrm);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FastSdk.onConfigurationChanged(this, newConfig);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
FastSdk.onActivityResult(this, requestCode, resultCode, intent);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
FastSdk.onNewIntent(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
FastSdk.onSaveInstanceState(outState);
}
@Override
public void onBackPressed() {
FastSdk.onBackPressed();
exit();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return FastSdk.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return FastSdk.dispatchTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
FastSdk.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
package com.hoolai.demo;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Process;
import android.text.TextUtils;
import com.hoolai.open.fastaccess.channel.HoolaiApplication;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class GameApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//如使用了Multidex 需要指定 hoolaisdk相关代码到主dex中
//-keep com.hoolai.**
HoolaiApplication.onApplicationCreate(this);
}
@Override
public void onTerminate() {
super.onTerminate();
HoolaiApplication.onApplicationTerminate(this);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
HoolaiApplication.onConfigurationChanged(this, newConfig);
}
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
HoolaiApplication.attachBaseContext(this, context);
}
/**
* 多进程判断,sdk已经做了处理,游戏可不做处理
* @param application
* @return
*/
public static boolean getProcessPerform(Application application){
String processName = getProcessName();
int pid = Process.myPid();
if(!TextUtils.isEmpty(processName) && processName.equals(application.getPackageName())){
return true;
}
return false;
}
public static String getProcessName() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
String processName = mBufferedReader.readLine().trim();
mBufferedReader.close();
return processName;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package com.hoolai.demo.share;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.hoolai.access.log.LogUtils;
import com.hoolai.fastsdk.demo.R;
import com.hoolai.open.fastaccess.channel.FastSdk;
import com.hoolai.open.fastaccess.channel.callback.FacebookShareCallback;
import com.hoolai.open.fastaccess.channel.callback.FacebookShareType;
import com.hoolai.open.fastaccess.channel.pojo.FaceBookShareData;
/**
* @author gaor
* @className: FacebookShareActivity
* @description TODO 描述 Facebook分享
* @date 2022/1/17 17:17
*/
public class FacebookShareActivity extends Activity {
private static final int FILE_SELECT_IMAGE_CODE = 010110;
private static final int REQUEST_WRITE_STORAGE_PERMISSION = 010111;
private static final int REQUEST_CODE_OTHER_FILE = 010112;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.share_facebook);
et = findViewById(R.id.et_text_fb);
et.setText("http://www.baidu.com");
requestPermission();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK ){
Uri uri = data.getData();
LogUtils.e("文件分享路径:"+uri.toString());
if (requestCode == FILE_SELECT_IMAGE_CODE){
shareImage(uri.toString());
}
if (requestCode == REQUEST_CODE_OTHER_FILE){
shareVideo(uri.toString());
}
}
}
/**
* FacebookShareType:要分享的类型,FacebookShareType.LINK
* String url:要分享的链接(必须是网络连接)
* String quote:引文
* String hashTag:必须以#号开头,类似微博的标签/话题(非必传)
* FacebookShareCallback:回调
* @param view
*/
public void facebookShareLink(View view){
String url = et.getText().toString();
if (TextUtils.isEmpty(url)){
Toast.makeText(FacebookShareActivity.this,"分享连接不能为空!",Toast.LENGTH_SHORT).show();
return;
}
FaceBookShareData data = new FaceBookShareData();
data.setHashTag("#"+this.getAppName(this));
data.setQuote(url);
data.setUrl(url);
FastSdk.facebookShare(FacebookShareType.LINK,data,new FacebookShareCallback() {
@Override
public void onSuccess(String s) {
Toast.makeText(FacebookShareActivity.this,"分享成功"+s,Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(FacebookShareActivity.this,"取消分享",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String s) {
Toast.makeText(FacebookShareActivity.this,"分享失败"+s,Toast.LENGTH_SHORT).show();
}
});
}
public void facebookShareImage(View view){
openFileChooser();
}
/**
* FacebookShareType:要分享的类型,
* FacebookShareType.IMAGE
* String photoUrl:要分享的图片地址(必须是本地图片路径),可分享1-6张图片
* String hashTag:必须以#号开头,类似微博的标签/话题(非必传)
* FacebookShareCallback:回调
* @param path
*/
public void shareImage(String path){
if (path==null){
Toast.makeText(this,"Uri路径不能为空!",Toast.LENGTH_SHORT).show();
return;
}
FaceBookShareData data = new FaceBookShareData();
// List<String> listBitMap = new ArrayList<>();
// listBitMap.add(path);
data.setHashTag("#demo");
// data.setBitMap(listBitMap);
data.addBitMap(path);
// data.addBitMap(photoUrl1);
// data.addBitMap(photoUrl2);//最多可添加6个图片...
FastSdk.facebookShare(FacebookShareType.IMAGE,data,new FacebookShareCallback() {
@Override
public void onSuccess(String s) {
Toast.makeText(FacebookShareActivity.this,"分享成功"+s,Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(FacebookShareActivity.this,"取消分享",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String s) {
Toast.makeText(FacebookShareActivity.this,"分享失败"+s,Toast.LENGTH_SHORT).show();
}
});
}
/**
* 选择图片
*/
private void openFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "选择文件"), FILE_SELECT_IMAGE_CODE);
overridePendingTransition(0, 0);
} catch (Exception ex) {
LogUtils.e("openFile Chooser:"+ex);
// Potentially direct the user to the Market with OnProgressChangeListener Dialog
Toast.makeText(this, "请先安装文件管理器", Toast.LENGTH_SHORT).show();
}
}
/**
* 选择视频
* @param view
*/
public void facebookShareVideo(View view){
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);// 支持多选
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "选择文件"), REQUEST_CODE_OTHER_FILE);
}
@TargetApi(24)
public void shareVideo(String path){
if (path == null){
Toast.makeText(this,"文件路径不能为空!"+path,Toast.LENGTH_SHORT).show();
return;
}
FaceBookShareData data = new FaceBookShareData();
data.setHashTag("#"+this.getAppName(this));
data.setVideoPath(path);
FastSdk.facebookShare(FacebookShareType.VIDEO,data,new FacebookShareCallback() {
@Override
public void onSuccess(String s) {
Toast.makeText(FacebookShareActivity.this,"分享成功"+s,Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(FacebookShareActivity.this,"取消分享",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String s) {
Toast.makeText(FacebookShareActivity.this,"分享失败"+s,Toast.LENGTH_SHORT).show();
}
});
}
/**
* 获取应用程序名称
*/
public static synchronized String getAppName(Context context) {
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
context.getPackageName(), 0);
int labelRes = packageInfo.applicationInfo.labelRes;
return context.getResources().getString(labelRes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取存储权限
*/
private void requestPermission() {
/*if (this.checkSelfPermission(FacebookShareActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE_PERMISSION);
} else {
Toast.makeText(this, "缺少文件读写权限,可能会造成无法分享文件", Toast.LENGTH_SHORT).show();
}
}*/
}
}
package com.hoolai.demo.share;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Toast;
import com.hoolai.access.open.fastaccess.utils.Logger;
import com.hoolai.fastsdk.demo.R;
import com.hoolai.open.fastaccess.channel.FastSdk;
import com.hoolai.open.fastaccess.channel.callback.FacebookShareCallback;
import com.hoolai.open.fastaccess.channel.callback.FacebookShareType;
import com.hoolai.open.fastaccess.channel.pojo.FaceBookShareData;
import java.util.ArrayList;
import java.util.List;
/**
* @author gaor
* @date 2023/12/14 20:22
* @description 分享
*/
public class ShareActivity extends Activity {
private static int REQUEST_PHOTO_PICKER_SINGLE_SELECT = 1008611;
private static int REQUEST_VIDEO_PICKER_SINGLE_SELECT = 1008612;
private FacebookShareCallback facebookShare = new FacebookShareCallback() {
@Override
public void onSuccess(String s) {
Toast.makeText(ShareActivity.this, "分享成功" + s, Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(ShareActivity.this, "取消分享", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String s) {
Toast.makeText(ShareActivity.this, "分享失败" + s, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share);
}
public void shareText(View view) {
String title = "系统文字分享";
String contentText = "分享内容";
com.hoolai.open.fastaccess.channel.FastSdk.invokeSpecialFunction(112, title, contentText);
}
public void shareVideo(View view) {
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, REQUEST_VIDEO_PICKER_SINGLE_SELECT);
}
public void sharePhoto(View view) {
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, REQUEST_PHOTO_PICKER_SINGLE_SELECT);
}
public void fbShareText(View view) {
FaceBookShareData data = new FaceBookShareData();
data.setHashTag("#" + getAppName(this));
data.setQuote("http://www.baidu.com");
data.setUrl("http://www.baidu.com");
FastSdk.facebookShare(FacebookShareType.LINK, data, facebookShare);
}
public void fbPhotoShare(View view) {
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, REQUEST_PHOTO_PICKER_SINGLE_SELECT);
}
public void fbShareVideo(View view) {
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, REQUEST_VIDEO_PICKER_SINGLE_SELECT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {
return;
}
Uri uri = data.getData();
if (uri == null) {
return;
}
Logger.i("shareActivity onActivityResult:" + uri.toString());
if (requestCode == REQUEST_PHOTO_PICKER_SINGLE_SELECT) {
/* String title = "系统图片分享";
com.hoolai.open.fastaccess.channel.FastSdk.invokeSpecialFunction(113, title, data1);*/
//facebook图片分享
FaceBookShareData faceBookShareData = new FaceBookShareData();
List<String> listBitMap = new ArrayList<>();
listBitMap.add(uri.toString());
faceBookShareData.setHashTag("#demo");
faceBookShareData.setBitMap(listBitMap);
FastSdk.facebookShare(FacebookShareType.IMAGE, faceBookShareData, facebookShare);
} else if (requestCode == REQUEST_VIDEO_PICKER_SINGLE_SELECT) {
//系统分享视频
//com.hoolai.open.fastaccess.channel.FastSdk.invokeSpecialFunction(115, "系统视频分享", uri);
//Facebook视频分享
FaceBookShareData faceBookShareData = new FaceBookShareData();
faceBookShareData.setHashTag("#" + getAppName(this));
faceBookShareData.setVideoPath(uri.toString());
FastSdk.facebookShare(FacebookShareType.VIDEO, faceBookShareData, facebookShare);
}
}
/**
* 获取应用程序名称
*/
public static synchronized String getAppName(Context context) {
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
context.getPackageName(), 0);
int labelRes = packageInfo.applicationInfo.labelRes;
return context.getResources().getString(labelRes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.hoolai.demo.utils;
import android.content.Context;
import com.hoolai.open.fastaccess.channel.FastSdk;
import com.hoolai.open.fastaccess.channel.UserExtDataKeys;
import java.util.HashMap;
import java.util.Map;
/**
* 模拟数据报送
*/
public class DataReportUtil {
/**
* //基础打点模拟报送 必须
* @param context
* @param userExtData
*/
public static void basisData(Context context, Map<String,String> userExtData){
// 创建角色
userExtData.put(UserExtDataKeys.ACTION, UserExtDataKeys.ACTION_CREATE_ROLE);
FastSdk.setUserExtData(context, new HashMap<String, String>(userExtData));
// 角色升级
userExtData.put(UserExtDataKeys.ACTION, UserExtDataKeys.ACTION_LEVEL_UP);
FastSdk.setUserExtData(context, new HashMap<String, String>(userExtData));
// 进入服务器
userExtData.put(UserExtDataKeys.ACTION, UserExtDataKeys.ACTION_ENTER_SERVER);
FastSdk.setUserExtData(context, new HashMap<String, String>(userExtData));
}
/**
* af数据模拟报送
* @param context
* @param userExtData
*/
public static void afDataSend(Context context, Map<String,String> userExtData){
userExtData.put(UserExtDataKeys.ACTION,"af_vip_1");
userExtData.put(UserExtDataKeys.CLASSFIELD, "vip_1");
FastSdk.setUserExtData(context, userExtData);
userExtData.put(UserExtDataKeys.ACTION,"af_gethero_14201");
userExtData.put(UserExtDataKeys.CLASSFIELD, "af_gethero_14201");
FastSdk.setUserExtData(context, userExtData);
userExtData.put(UserExtDataKeys.ACTION,"af_seiya_recharge4999");
userExtData.put(UserExtDataKeys.CLASSFIELD, "seiya_recharge49.99");
FastSdk.setUserExtData(context, userExtData);
userExtData.put(UserExtDataKeys.ACTION,"af_click_0dot99");
userExtData.put(UserExtDataKeys.CLASSFIELD, "click_0dot99");
FastSdk.setUserExtData(context, userExtData);
}
public static void DataSend(Context context, Map<String, String> userExtData) {
userExtData.put(UserExtDataKeys.ACTION,"guild_join");
userExtData.put(UserExtDataKeys.CLASSFIELD, "guild_join");
FastSdk.setUserExtData(context, userExtData);
userExtData.put(UserExtDataKeys.ACTION,"loginreward_day_7");
userExtData.put(UserExtDataKeys.CLASSFIELD, "loginreward_day_7");
FastSdk.setUserExtData(context, userExtData);
}
}
package com.hoolai.demo.utils;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
/**
* Uri tools
*/
public class Utils {
/**
* 根据Uri获取图片的绝对路径
*
* @param context 上下文对象
* @param uri 图片的Uri
* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
*/
public static String getRealPathFromUri(Context context, Uri uri) {
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= 19) { // api >= 19
return getRealPathFromUriAboveApi19(context, uri);
} else { // api < 19
return getRealPathFromUriBelowAPI19(context, uri);
}
}
/**
* 适配api19以下(不包括api19),根据uri获取图片的绝对路径
*
* @param context 上下文对象
* @param uri 图片的Uri
* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
*/
private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
return getDataColumn(context, uri, null, null);
}
/**
* 适配api19及以上,根据uri获取图片的绝对路径
*
* @param context 上下文对象
* @param uri 图片的Uri
* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
*/
@SuppressLint("NewApi")
private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
String filePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document类型的 uri, 则通过document id来进行处理
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) { // MediaProvider
// 使用':'分割
String id = documentId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) { // DownloadsProvider
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
filePath = getDataColumn(context, contentUri, null, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是 content 类型的 Uri
filePath = getDataColumn(context, uri, null, null);
} else if ("file".equals(uri.getScheme())) {
// 如果是 file 类型的 Uri,直接获取图片对应的路径
filePath = uri.getPath();
}
return filePath;
}
/**
* 获取数据库表中的 _data 列,即返回Uri对应的文件路径
*
*/
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String path = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
path = cursor.getString(columnIndex);
}
} catch (Exception e) {
if (cursor != null) {
cursor.close();
}
}
return path;
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is MediaProvider
*/
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is DownloadsProvider
*/
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
}
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment