Android SDK 接入手册
请在文档的引导下,进行必要的编码,SDK开发包请与天下网游技术人员联系后获取.
请在文档的引导下,进行必要的编码,SDK开发包请与天下网游技术人员联系后获取.
工程必须使用 Android 最新 SDK 编译
APK包必须签名,提交Google Play商店以后,签名不可更改
APK包必须 zipalign 优化
天下平台将提供以下信息,用于Android App工程的配置
Package Name Android应用标识
Display Name 应用显示名
AppID SDK 应用ID
AppKey SDK 应用Key
Fuid 渠道标识
Facebook ID Facebook 应用ID
以上参数可以在SDK zip包中的 SDK更新说明.txt 文件中找到.
(ANDROID)com.txwy.passport.sdk(游戏名)版本.zip/
├── SDK更新说明(Bundle identifier).txt
├── com.txwy.passport.sdk/
│ ├── res
│ │ ├── drawable-hdpi
│ │ ├── layout-land
│ │ ├── layout-port
│ │ ├── values
├── libs
│ ├── com.txwy.passport.sdk.jar
│ ├── libTyrantdbGameTracker.jar
│ ├── partytrack.jar
│ ├── AF-Android-SDK.jar
│ └── google-play-services.jar
└── FacebookSDK
提交 Google Play 的APK 必须小于 100 MB
, 大于 100MB 的App,需要进行OBB分包
.
建议APK不大于 97 MB
[main|patch].<expansion-version>.<package-name>.obb
main OBB正式包
patch OBB补丁包
expansion-version android:versionCode
package-name Your application's Java-style package name.
实例:<shared-storage>/Android/obb/com.example.app/main.314159.com.example.app.obb
<shared-storage> 可以通过系统函数 getExternalStorageDirectory 获取正确的存放位置
玩家在Google Play商店安装游戏时,会自动安装APK和OBB,提示安装成功时,OBB已经被正确的安装.
如果obb目录中,有多个版本的.obb,请优选选择版本匹配的obb文件,或者版本比较接近的obb文件.
Google提供的例程 http://developer.android.com/google/play/expansion-files.html#GettingFilenames (需要翻墙)
// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";
static String[] getAPKExpansionFiles(Context ctx, int mainVersion,
int patchVersion) {
String packageName = ctx.getPackageName();
Vector<String> ret = new Vector<String>();
if (Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)) {
// Build the full path to the app's expansion files
File root = Environment.getExternalStorageDirectory();
File expPath = new File(root.toString() + EXP_PATH + packageName);
// Check that expansion file path exists
if (expPath.exists()) {
if ( mainVersion > 0 ) {
String strMainPath = expPath + File.separator + "main." +
mainVersion + "." + packageName + ".obb";
File main = new File(strMainPath);
if ( main.isFile() ) {
ret.add(strMainPath);
}
}
if ( patchVersion > 0 ) {
String strPatchPath = expPath + File.separator + "patch." +
mainVersion + "." + packageName + ".obb";
File main = new File(strPatchPath);
if ( main.isFile() ) {
ret.add(strPatchPath);
}
}
}
}
String[] retArray = new String[ret.size()];
ret.toArray(retArray);
return retArray;
}
// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile =
APKExpansionSupport.getAPKExpansionZipFile(appContext,
mainVersion, patchVersion);
// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);
以下依赖项都必须正确应用到工程
依赖库 | |||
---|---|---|---|
com.txwy.passport.sdk.jar | 天下网游 SDK | libTyrantdbGameTracker.jar | TyrantdbGame Tracker |
partytrack.jar | Party Tracker | AF-Android-SDK.jar | Appsflyer Tracker |
android-support-v4包 | 自行获取,使用>=24.2.0版本 |
Google Service依赖库
play-services-base-release.aar | play-services-basement-release.aar |
---|---|
play-services-auth-11.0.4.jar | play-services-auth-base-11.0.4.jar |
play-sercices-analytics-11.0.4.jar | play-sercices-analytics-impl-11.0.4.jar |
play-services-tagmanager-v4-impl-11.0.4.jar | play-services-tasks-11.0.4.jar |
需要合并到APK的资源 (复制到APK工程资源目录中) | |
---|---|
将res中的文件拷贝至工程的对应目录下 |
需要添加FacebookSdk的依赖(FacebookSdk是一个library工程) |
---|
将FacebookSdk导入工作空间,并添加依赖。 在project.properties文件中添加:android.library.reference.1=../FacebookSdk |
Android SDK版本
minSdkVersion
必须大于等于 11
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.android.vending.BILLING" />
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true"/>
添加Activity
<activity android:name="com.txwy.passport.model.MainActivity"
android:label="@string/app_name"
android:hardwareAccelerated="true"
android:screenOrientation="sensorLandscape"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
</activity>
注意:竖屏需要将sensorLandscape 改为:sensorPortrait
<activity android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<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>
<activity
android:name="com.facebook.CustomTabMainActivity"
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>
注意:如果使用的Google为新版本,必须加上以下注册
<activity
android:name="com.google.android.gms.auth.api.signin.internal.SignInHubActivity"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
请增加以下 meta-data
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
请增加以下 provider
<provider android:authorities="@string/fb_provider_authorities"
android:name="com.facebook.FacebookContentProvider"
android:exported="true" />
请增加以下 Receiver
<receiver android:name="it.partytrack.sdk.MultipleReferrerReceiver" android:exported="true" >
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
<meta-data android:name="com.appsflyer.AppsFlyerLib" android:value="com.appsflyer.AppsFlyerLib" />
</receiver>
请增加以下 Service
<service android:name="com.txwy.passport.xdsdk.pull.JobSchedulerService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
注意:如果没有添加“android.permission.BIND_JOB_SERVICE“权限保护,则该操作系统将忽略该服务。所以必须添加该权限
<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="fbFacebookAppID" android:host="cometid" android:path="/tw"/>
</intent-filter>
<activity
android:name="com.txwy.passportdemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="fb1122334455667788" android:host="cometid" android:path="/tw"/>
</intent-filter>
</activity>
fb1122334455667788 是例子,请勿使用!!!
FacebookAppID : Facebook 应用ID
可以在 SDK更新说明.txt
文件中找到参数值
前提条件:
把天下网游提供的google-services.json文件拷贝至项目的模块文件夹中(通常是 app/)。
Android Studio---(aar包)
把以下资源包放入libs
firebase-analytics-11.0.4.jar | firebase-analytics-impl-11.0.4.jar |
---|---|
firebase-common-11.0.4.jar | firebase-core-11.0.4.jar |
firebase-iid-11.0.4.jar | firebase-messaging-11.0.4.jar |
向您的根级 build.gradle
文件添加规则,以纳入 Google 服务插件:
buildscript {
// ...
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
// ...
compile(name: 'play-services-base-release', ext: 'aar')
compile(name: 'play-services-basement-release', ext: 'aar')
}
}
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="@string/txwy_firebase_app_package_name" />
</intent-filter>
</receiver>
<service android:name= "com.txwy.passport.xdsdk.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- 初始化Firebase-->
<provider android:authorities="@string/txwy_firebase_init_provider_authorities" android:exported="false" android:initOrder="100" android:name="com.google.firebase.provider.FirebaseInitProvider"/>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notify_icon" />
1.运行 Android 4.0 或更高版本以及 Google Play 服务 11.0.4 或更高版本的设备。
2.最新版本的 Android Studio,1.5 版或更高版本。
向您的根级 build.gradle
文件添加规则,以纳入 Google 服务插件:
buildscript {
// ...
dependencies {
// ...
classpath 'com.google.gms:google-services:3.1.0'
}
}
在模块 Gradle 文件(通常是 app/build.gradle
)中,在文件的底部添加 apply plugin
代码行,以启用 Gradle 插件:
apply plugin: 'com.android.application'
android {
// ...
}
dependencies {
// ...
compile 'com.android.support:support-v4:24.2.0'
compile 'com.google.firebase:firebase-core:11.0.4'
compile 'com.google.firebase:firebase-messaging:11.0.4'
// Getting a "Could not find" error? Make sure you have
// the latest Google Repository in the Android SDK manager
}
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
AndroidManifest配置
<service android:name= "com.txwy.passport.xdsdk.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notify_icon" />
SDKTxwyPassport.firebaseMessageSwitch(Activity act , boolean isOpen);
注意:由于类过多编译时有可能会报异常:
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'. > com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
解决方法:更改gradle版本
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
增加参数
defaultConfig {
//...
multiDexEnabled true
}
在代码中引用SDK
import com.txwy.passport.sdk.SDKTxwyPassport;
请确保在 Launcher Activity OnCreate 函数中初始化SDK
protected void onCreate(Bundle savedInstanceState) {
String appID = "天下APPID";
String appKey = "天下APPKEY";
String fuid = "渠道标识";
SDKTxwyPassport.setAppInfo(this, appid, appkey, fuid);
}
this 为 Activity 类指针.
所需要的参数,可以在 SDK更新说明.txt 文件中找到.
this 为 Activity 类指针.
SDKTxwyPassport.signIn(this, new SDKTxwyPassport.SignInDelegete() {
@Override
public void txwyDidPassport() {
// 登录完成
SDKTxwyPassportInfo passport = SDKTxwyPassport.getPassportInfo(this);
// passport.uid 用户ID
// passport.uname 用户名
// passport.sid 用户登录凭证
// passport.isGuest = true 则为游客身份登录
// passport.isBindPhoneNum = true 则为用户已绑定手机
if (passport == null) {
// 帐号已登出
return;
}
// 帐号已成功登录通行证
// 将 passport.sid 传递给服务器,服务器通过通行证接口验证sid,以确保登录账号合法。
}
});
public class SDKTxwyPassportInfo {
int uid; 通行证ID,玩家唯一数字标识
String sid; 通行证登录凭证
String fuid; 用户来源渠道标识
boolean isGuest; 标识是否游客身份登录
boolean isBindPhoneNum; 标识用户是否已经绑定手机
}
this 为 Activity 类指针.
// 首先登出当前账号,无任何事件回调
SDKTxwyPassport.signOut(this);
// 紧接着调登入接口
SDKTxwyPassport.signIn(this, new SDKTxwyPassport.SignInDelegete() {
@Override
public void txwyDidPassport() {
// 登录完成
SDKTxwyPassportInfo passport = SDKTxwyPassport.getPassportInfo(this);
}
});
* 游戏内提供登出按钮
* 点击登出按钮,游戏退出到选择服务器界面
请在玩家登录游戏服务器或者角色升级以后调SDK跟踪接口
this 为 Activity 类指针.
SDKTxwyPassport.trackAccount(this, "服务器ID", 角色等级);
服务器ID需要与天下网游平台协商,平台的客服中心,平台充值等都需要使用相同的服务器ID。
完成游戏新手引导的时刻,调用此接口
this 为 Activity 类指针.
SDKTxwyPassport.evtCompletedTutorial(this);
达成成就特定的时刻(和运营确认),调用此接口
this 为 Activity 类指针.
SDKTxwyPassport.evtUnlockedAchievement(this);
SDKTxwyPassport.evtTrack(this , String evtName);
游戏必须接入天下网游的客服中心
this 为 Activity 类指针.
SDKTxwyPassport.bugReport(this, "服务器ID", "角色昵称", "游戏客户端版本号");
this 为 Activity 类指针.
SDKTxwyPassport.userCenter(this, "服务器ID", "角色昵称", "游戏客户端版本号");
若未登录游戏服务器,服务器ID 请传入 "1"
若游戏角色未登录,角色昵称 请传入 "未登入"
建议放置位置: 游戏内选项界面, 选服界面
下列系统回调必须传递到SDK接口,否则SDK无法正常工作
this 为 Activity 类指针.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Pass on the activity result to the helper for handling
if (!SDKTxwyPassport.handleActivityResult(this, requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
}
this 为 Activity 类指针.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions
, @NonNull int[] grantResults) {
SDKTxwyPassport.onRequestPermissionsResult(this , requestCode , permissions , grantResults);
}
需要注意,实现OnRequestPermissionsResultCallback接口的activity必须和传递给SDKTxwyPassport.setAppInfo(activity, appid, appkey, fuid)方法中的activity是同一个。
跟踪玩家游戏次数和游戏时长。需要给游戏中每个Activity的onResume和onStop中添加对应的调用,如果多个Activity继承同一个父类,只需要在父类中添加调用即可。比如onResume方法,直接在Activity的onResume方法的最后添加SDKTxwyPassport.onResume(this)即可。
this 为 Activity 类指针.
SDKTxwyPassport.onResume(this);
SDKTxwyPassport.onStop(this);
this Activity 类指针.
SDKTxwyPassport.storeReview(this, new SDKTxwyPassport.storeReviewListener() {
@Override
public void onClickReview() {
// 用户点击评分按钮
}
@Override
public void onClickWait() {
// 用户点击下次评分按钮
}
@Override
public void onClickRefuse() {
// 用户点击拒绝评分按钮
}
});
充值界面由游戏开发方提供.
充值项的设定,找运营索取
支付产品的价格需要通过SDK提供的接口查询.
请在游戏启动过程中,后台异步查询价格.
避免
在显示商店时同步查询价格,这会导致打开商店界面有明显的延迟.
this 为 Activity 类指针.
List products = new ArrayList();
products.add("txwy_001");
products.add("txwy_002");
SDKTxwyPassport.queryWithProducts(this, products, new SDKTxwyPassport.ProductQueringListener() {
@Override
public void onQuery(List<SkuDetails> skus) {
//查询失败
if (null == skus)
return;
for (int i = 1; i <= skus.toArray().length; i++){
SkuDetails sku = (SkuDetails) skus.toArray()[i-1];
if (sku!=null){
//sku.getSku() -- 产品ID
//sku.getAmount() -- 价格
//sku.getCur() -- 货币
//sku.getDisplayPrice() -- 显示价格
}
}
}
});
某些情况下 queryWithProducts
会失败,返回空的产品列表,请显示默认的产品价格,默认价格可以找运营索取 文件中找到
this Activity 类指针.
产品ID 充值产品ID,由天下网游平台配置,可以找运营索取
服务器ID 服务器ID
Mark 透传参数 充值透传参数,天下网游充值平台会原样传回到游戏服务器,详见支付服务器对接
level 角色等级,或者其它可以标识游戏进度的等级
SDKTxwyPassport.payWithProductID(this, "产品ID", "服务器ID", "Mark 透传参数", 角色等级, new SDKTxwyPassport.PaymentListener() {
@Override
public void onPayment(SkuDetails skuDetail) {
// 平台充值成功,游戏服务器可能还没有收到平台的充值请求。
}
@Override
public void onCancel() {
//出错或用户取消
}
});
收到 onPayment
回调不代表充值已到账,以游戏服务端收到天下网游充值平台回调为准.
游戏服务器端访问下面的连接
http://p.txwy.tw/passport/auth?sid=1011e33ca7988e3804cc5e0da6298e27
sid 客户端登录成功以后通过 getPassportInfo 接口获取,并传递到游戏服务器。
请求成功返回
{"error":"","uid":12345678,"uname":"用户名"}
请求失败返回
{"error":"错误信息"}
p.txwy.tw
是港澳台地区通行证域名,其它地区通行证域名请以 SDK更新说明.txt
文件中说明为准.
需要游戏开发方提供游戏服务器充值的接口.
充值平台向游戏服务器充值接口发起 GET 请求
http://游戏服务器域名/充值接口
GET 参数
productid 产品标识,作为充值依据,字符串类型
uid 玩家的唯一标识,数字类型,只要可以唯一标识一个玩家即可,要于登录接口一致
order 本次充值在平台上的订单号,字符串类型,充值请求的唯一性标识
sign 充值票据
server_id 游戏服务器ID,字符串类型
mark 充值透传参数(可选)
pay_way 支付方式. appstore iOS充值 | googleplay Google商店充值 | txwy 第三方充值
sign 充值票据验证算法
算法生成的哈希值(小写)
md5(uid + "_" + order + "_" + productid + "_" + mark + "_" + AppKey)
游戏服务器充值接口返回值协议
调用返回用纯文本的数字错误编号,数字错误编号如下(不允许有任何换行和html代码)
1 充值成功(重复订单号储值也返回1)
2 充值的服务器不存在,请确认游戏服域名正确并已被添加到后台
3 充值游戏币有误
5 md5错误,请确认密钥正确,充值票据算法跟文档描述一致,参与票据计算的参数于传递给接口的参数一致
7 不存在此账号,请确认用户名和登录接口传递的是一致的
0 充值失败,订单处于待充状态,可以重复请求直到返回值为1
-1 充值请求参数错误
对于充值失败的订单服务器有重跑机制,一般每5分钟会对充值状态为待充的订单进行重新请求,处理为成功状态(也就是返回0的订单),若超过5分钟订单还未执行成功请与运营同学联系。
仅接入Appstore, Googleplay充值时,可以暂时不实现此接口
如果游戏服务器充值接口没有用到 mark 参数则此接口不用实现
充值平台向游戏服务器生成Mark接口发起 GET 请求
http://游戏服务器域名/生成Mark接口
GET 参数
uid 玩家的唯一标识,数字类型,只要可以唯一标识一个玩家即可,要于登录接口一致
sid 游戏服务器ID,字符串类型
游戏服务器生成Mark接口返回值协议
调用返回用json格式数据
{
ret: 0,
error: "错误信息",
mark: "开发方协商约定的参数"
}
ret 错误编码,无错误返回 0
error 返回错误信息
mark 生成的Mark参数
ret 取值:
0 查询成功,需要返回 mark 字段
1 查询失败,仅需要返回 error 字段
查询昵称
充值平台向游戏服务器查询昵称接口发起 GET 请求
http://游戏服务器域名/查询昵称接口
GET 参数
uid 玩家的唯一标识,数字类型,只要可以唯一标识一个玩家即可,要于登录接口一致
sid 游戏服务器ID,字符串类型
游戏服务器查询昵称接口返回值协议
调用返回用json格式数据
单角色
{
ret: 0,
error: "错误信息",
roleid: "角色ID",
nickname: "昵称",
level: 1
lifecard: 1 (角色终身卡状态: 1为已拥有, 2为未拥有, 可选字段)
monthcard: 1 (角色月卡状态: 1为已拥有, 2为未拥有, 可选字段)
}
多角色
{
ret: 0,
error: "错误信息",
players: [{
roleid: "角色ID",
nickname: "昵称",
level: 1
lifecard: 1 (角色终身卡状态: 1为已拥有, 2为未拥有, 可选字段)
monthcard: 1 (角色月卡状态: 1为已拥有, 2为未拥有, 可选字段)
}]
}
ret 取值:
0 查询成功,需要返回 roleid, nickname, level 字段
1 查询失败,仅需要返回 error 字段
第三方充值
游戏服务器需要配置 网页充值需要的产品项, 这些充值产品项不显示在客户端。
产品项:
web01 2元宝
web20 20元宝
web50 50元宝
接口: https://se-sg.tapdb.net/tapdb/online
方法: POST
格式: json
必须头信息: Content-Type: application/json
参数名 | 参数类型 | 参数说明 |
---|---|---|
appid | string | TapDB的appid |
onlines | array | 多条在线数据(最多100条) |
参数名 | 参数类型 | 参数说明 |
---|---|---|
server | string | 服务器,TapDB对同一服务器每一个自然5分钟仅接受一次数据 |
online | int | 在线人数 |
timestamp | long | 当前统计数据的时间戳(秒),TapDB会按照自然5分钟进行数据对齐 |
{
"appid":"gkjasd13bbsa1sdk",
"onlines":[{
"server":"s1",
"online":123,
"timestamp":1489739590
},{
"server":"s2",
"online":188,
"timestamp":1489739560
}]
}
“向上”按钮用于根据屏幕之间的层级关系在某个应用内部导航。 例如,如果屏幕 A 显示项目列表,并且选择某个项目会调出屏幕 B(该屏幕显示项目的更多详情),则屏幕 B 应提供可返回屏幕 A 的“向上”按钮。
如果屏幕是应用中层级最高的屏幕(即应用的主屏幕),则无需提供向上按钮。
系统的“返回”按钮用于按照用户最近操作的屏幕历史记录,按时间逆序导航。 它通常基于屏幕之间的时间关系,而非应用的层级关系。
如果之前查看的屏幕也是当前屏幕的父级项,按下“返回”按钮的作用跟按下“向上”按钮一样 — 这种情况很常见。 但是,“向上”按钮可确保用户留在应用内,与此不同的是,“返回”按钮可让用户返回到主屏幕,甚至返回不同的应用。
战斗支持暂停的游戏,战斗中按返回键要暂停
战斗支持暂停的游戏,返回桌面时游戏要自动暂停
关闭按钮需要关闭窗口不能返回上一层级
public void hideNavigationBar() {
int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE ;
if( android.os.Build.VERSION.SDK_INT >= 19 ){
uiFlags |= 0x00001000;
} else {
uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
getWindow().getDecorView().setSystemUiVisibility(uiFlags);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if( hasFocus ) {
hideNavigationBar();
}
}
android.permission.WRITE_SETTINGS
android.permission.NFC
android.permission.MANAGE_ACCOUNTS
android.permission.GET_ACCOUNTS
android.permission.USE_CREDENTIALS
android.permission.AUTHENTICATE_ACCOUNTS
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.CHANGE_WIFI_STATE
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.CHANGE_CONFIGURATION
android.permission.SEND_SMS
android.permission.CALL_PHONE
android.permission.CHANGE_NETWORK_STATE
android.permission.PROCESS_OUTGOING_CALLS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.READ_SMS
android.permission.RECEIVE_SMS
android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
com.android.vending.CHECK_LICENSE
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
android.permission.BROADCAST_STICKY
android.permission.GET_TASKS
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.SYSTEM_ALERT_WINDOW
android.permission.RECORD_AUDIO
android.permission.READ_LOGS
android.permission.CAMERA
以下是经过提炼的需求,一般做到本文档需求即可获得推荐
<application
...
android:theme="@android:style/Theme.Holo.Light.DarkActionBar">
在AndroidManifest.xml中appilication层加上主题
Facebook 应用由天下网游平台配置,并提供可以测试分享的Facebook账号.
测试Facebook的相关功能,需要翻墙!
this Activity 类指针.
Bitmap Bitmap 类型图片对象
feedDelegete 回调
SDKTxwyPassport.feedWithImage(this, Bitmap, new SDKTxwyPassport.feedDelegete() {
@Override
public void txwyDidFeed(String error) {
if (error.equals("success"))
{
//分享成功
}
else
{
//分享失敗
}
}
});
this Activity 类指针.
SDKTxwyPassport.iLikeWithSvrID(this, "服务器ID", "角色昵称");
libs/tweet-composer-3.0.0.jar
配置文件中,添加以下代码.
<activity
android:name="com.twitter.sdk.android.tweetcomposer.ComposerActivity"
android:exported="false"
android:windowSoftInputMode="adjustResize|stateVisible" />
<service
android:name="com.twitter.sdk.android.tweetcomposer.TweetUploadService"
android:enabled="true"
android:exported="false" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="@string/twitter_provider_authorities"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
this Activity 类指针.
msg 分享文本
url 跳转链接
bitmap 图片
SDKTxwyPassport.twitterFeed(this, "msg", "url", Bitmap);
1、分享时必须安装Twitter客户端,否则分享失败。
2、AndroidManifest.xml中的配置文件必须配置。
libs/kakao_auth.jar
libs/kakao_friends.jar
libs/kakao_network.jar
libs/kakao_s2.jar
libs/kakao_usermgmt.jar
libs/kakao_util.jar
libs/kakaostory.jar
配置文件中,添加以下代码.
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />
<activity
android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
android:launchMode="singleTop"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
this Activity 类指针.
content 分享文本
bitmap 图片
SDKTxwyPassport.kakaoFeed(this, "content", Bitmap);
1、分享时必须安装Kakaostory客户端,否则分享失败。
2、AndroidManifest.xml中的配置文件必须配置,否则会初始化失败。
CafeSdk导入工作空间,并添加依赖:
在project.properties文件中添加:
android.library.reference.1=../CafeSdk
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<activity android:name="com.nhn.android.naverlogin.ui.OAuthLoginActivity"
android:screenOrientation="sensorLandscape"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<activity android:name="com.nhn.android.naverlogin.ui.OAuthLoginInAppBrowserActivity"
android:screenOrientation="sensorLandscape"
android:label="OAuth2.0 In-app"/>
聊天屏蔽規則:
1,对指定等级做屏蔽字限制;
2,对等级高于我们设定值的玩家不做限制;
3,被屏蔽发言自己客户端可正常显示,无特殊提示;
4,被屏蔽的发言整句都不显示在聊天频道,触发屏蔽的玩家和其他玩家都无法得知是哪句话触发了屏蔽
舉例:
我們限制等級15級以下的玩家,聊天有限制
15級以下的玩家,如果聊天中包涵:line,LINE,=,元寶,等字眼,他所發的消息,就只有他自己看得到,其他玩家是收不到了。
设置SDK的系统语言(多语言版本适用)
this 为 Activity 类指针.
SDKTxwyPassport.setLanguage(this, "语言字符");
tw | 繁体 | cn | 简体 | en | 英语 | de | 德语 |
---|---|---|---|---|---|---|---|
jp | 日语 | kr | 韩语 | th | 泰国 | vi | 越南 |
tr | 土耳其语 | es | 西班牙语 | ru | 俄语 | fr | 法语 |
pt | 葡萄牙语 | id | 印尼语 |
新增权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
新增 Activity
<activity android:configChanges="locale|keyboardHidden|orientation|screenSize|layoutDirection" android:excludeFromRecents="true" android:name="com.skplanet.dodo.IapWeb" android:windowSoftInputMode="stateHidden"/>
新增 Meta-Data
<meta-data android:name="iap:api_version" android:value="4" />
libs/kr-iap-sk_*.jar
请勿在提交Google Play的包中,包含 libs/kr-iap-sk_*.jar !
p-kr.playcomet.com
p-jp.playcomet.com