rcsdk  3.0.0.0
使用步骤

本页介绍rodcell sdk如何集成,这个步骤是使用标准的android工程项目,使用ant来编译代码。对于eclipse,通过简单设置也可以使用。

第一步:配置AndroidManifest.xml

在AndroidManifest.xml的Application段内添加相应的权限:

共用的权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其他支付或sdk需要的权限:

<!-- Google Play In-App-Billing 支付权限 -->
<uses-permission android:name="com.android.vending.BILLING" />
<!-- -->
<!-- sohagame sdk 需要添加的权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-feature android:name="android.hardware.wifi"
android:required="false" />
<uses-feature android:name="android.hardware.touchscreen"
android:required="false" />
<!-- -->
<!-- codapay 需要添加的权限 -->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- -->
<!-- GCM 权限 -->
<permission android:name="com.rodcell.rcsdk.test.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.rodcell.rcsdk.test.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- -->
<!-- mimopay 权限 -->
<uses-permission android:name="android.permission.READ_SMS" />
<!-- -->

application 中添加 下面的相关配置

<!-- google ad start -->
<meta-data android:name="com.google.android.gms.version"
android:value="6111000" />
<activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent" />
<!-- google ad end -->
<!-- facebook start -->
<!-- import: 新版本facebook的sdk在初始化时会读取以下meta-data,使用facebook必须在此配置,fb_app_id为res/values/strings中的字符串格式的字段
类似以下:
<string name="fb_app_id">1541019842815072</string>
-->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_app_id"/>
<activity android:name="com.facebook.LoginActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<!-- facebook end -->
<service android:name="com.rodcell.rcsdk.core.service"
/>
<activity android:label="rodcell_web"
android:alwaysRetainTaskState="true"
android:theme="@android:style/Theme.Dialog"
android:configChanges="orientation|screenSize"
android:name="com.rodcell.rcsdk.ui.Rodcell_ui" />
<!-- codapay 支付 -->
<activity android:label="codpay_web"
android:configChanges="orientation|screenSize"
android:alwaysRetainTaskState="true"
android:screenOrientation="unspecified"
android:name="com.codapayments.sdk.pay.CodaWeb" />
<receiver android:name="com.codapayments.sdk.message.PendingTxnReceiver"
android:enabled="true" />
<!-- -->
<!-- mimopay 支付 -->
<activity
android:name="com.mimopay.MimopayActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateUnspecified|adjustPan"
>
</activity>
<!-- -->
<!-- soha 渠道-->
<activity
android:name="vn.soha.game.sdk.SohaActivity"
android:exported="true" />
<receiver android:name="vn.soha.game.sdk.InstallReceiver"
android:exported="true" >
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<service android:name="vn.sohagame.sdkdemo.GCMIntentService" />
<!-- -->
<!-- GCM 配置 soha 渠道也需要-->
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
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="com.rodcell.rcsdk.test" />
</intent-filter>
</receiver>
<!-- -->

第二步: 添加相关代码

在项目的整体使用

//....其他代码
//....其他代码
// 这里建议集成自FragmentActivity,部分sdk需要.
public class MainActivity extends FragmentActivity{
// 这里是客户端接收到的从sdk收到的消息的所有处理的地方,对于操作是否成功的一个简单的判定就是msg.what是否为零,如果为零,则为成功。
class ClientHander extends Handler {
@Override
public void handleMessage(Message msg) {
String str2 = (String)(msg.obj);
if (msg.what == 0) {
String str = (String)(msg.obj);
try {
Toast.makeText(MainActivity.this, "success data=" +str,Toast.LENGTH_LONG).show();
JSONObject data = new JSONObject(str);
if ("show_button".equals(data.getString("op"))) {
//MainActivity.spy_status = true;
} else if ("hide_button".equals(data.getString("op"))) {
//MainActivity.spy_status = false;
} else if ("pay_result".equals(data.getString("op"))) {
JSONObject json = new JSONObject();
json.put("op", "check_order");
json.put("ordierid", data.getString("orderid"));
Sdk.req(json.toString());
}
} catch (Exception e) {
}
} else {
String str =(String)(msg.obj);
Toast.makeText(MainActivity.this, "fail data=" +str,Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onCreate(Bundle bundle)
{
//....其他代码
Sdk sdk = new Sdk(this);
Sdk.registerHandler(new ClientHander());
//....其他代码
}
@Override
protected void onPause()
{
Sdk.onPause();
super.onPause();
}
@Override
protected void onResume()
{
Sdk.onResume();
super.onResume();
}
@Override
protected void onNewIntent(Intent intent)
{
Sdk.onNewIntent(intent);
super.onNewIntent(intent);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
Sdk.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy()
{
Sdk.onDestroy();
super.onDestroy();
}
}

sdk的所有消息内容均以json格式的字符串封装方式放在msg.obj中,消息的操作类型均保存在op字段中的字符串格式。简单的判断操作是成功还是失败的方式是msg.what是否为零,如果为零,则为成功。 msg.obj中json格式的最基本字段结构:

{
op: 操作类型,字符串格式,比如:"init","pay_result","show_button"等等,除pay操作返回的操作类型为"pay_result"之外,其他的大都为请求时的op操作字符串
ret: 操作结果,整数格式,表示执行成功,或者失败,成功时为0,负值为失败,正值表示正在进行下一步操作,需要服务器确认等等
}

同时,如果请求的内部包含有其他的字段的话,也会一并返回。

第三步,调用sdk相关功能:

目前,SDK支持以下的功能调用 所有的操作中,游戏本身不要使用type字段,type字段为sdk使用,当该字段存在时,sdk将使用该字段指定的操作方式进行操作。 目前, type字段可以为下列中的一个: google_plugins Rodcell_plugins facebook_plugins coda_plugins //预留,目前无实质操作 mimo_plugins TDP_plugins //预留,目前无实质操作 googlead_plugins 所有的请求操作应该在接收到操作为init并成功之后再发送。 使用例子: 登录 例子

JSONObject json = new JSONObject();
json.put("username", "a@a.com");
Sdk.login(json.toString());

调用后,用户完成操作(可能失败,也可能取消,也可能正确完成),在设置的handle将会接收到类似下面的消息: msg.what == 0: 支付完成,msg.obj为以下的格式:

{
"op":"login",
"type":"Rodcell_plugins", //这个是一个例子,表示使用的哪一个方式登录
"ret":0
.... 其他的参数
}

mag.what != 0: 支付出现问题,msg.obj为以下的格式:

{
"op":"login",
"type":"Rodcell_plugins", //这个是一个例子,表示使用的哪一个方式登录
"ret":-1 //或者其他值,但不是0
.... 其他的参数
}

支付 例子

JSONObject json = new JSONObject();
json.put("paycode", "rix_test_all");
json.put("fee", 800);
json.put("desc", "fasdfadf");
json.put("name", "倚天剑");
Sdk.pay(json.toString());
参数说明:
paycode 计费点信息
fee 价格(建议为本地价格,真实支付时可能因为不同的通道而限制不同的价格)
name 道具的名称
desc (非必须,建议写,在支付时的页面时可以显示)
如果指定了type字段,则使用指定的支付方式进行支付。

支付调用后,用户完成操作(可能失败,也可能取消,也可能支付完成),在设置的handle将会接收到类似下面的消息: msg.what == 0: 支付完成,msg.obj为以下的格式:

{
"op":"pay_result",
"type":"Rodcell_plugins", //这个是一个例子,表示使用的哪一个支付
"name":"倚天剑",
"paycode":"rix_test_all",
"desc":"fasdfadf",
"ret":0
}

mag.what != 0: 支付出现问题,msg.obj为以下的格式:

{
"op":"pay_result",
"type":"Rodcell_plugins", //这个是一个例子,表示使用的哪一个支付
"name":"倚天剑",
"paycode":"rix_test_all",
"desc":"fasdfadf",
"ret":-1 //或者其他值,但不是0
}

分享 例子

JSONObject json = new JSONObject();
Sdk.share(json.toString());

调用后,用户完成操作(可能失败,也可能取消,也可能正确完成),在设置的handle将会接收到类似下面的消息: msg.what == 0: 支付完成,msg.obj为以下的格式:

{
"op":"share",
"type":"facebook_plugins", //这个是一个例子,表示使用的哪一个方式分享
"ret":0
.... 其他的参数
}

mag.what != 0: 支付出现问题,msg.obj为以下的格式:

{
"op":"share",
"type":"facebook_plugins", //这个是一个例子,表示使用的哪一个方式分享
"ret":-1 //或者其他值,但不是0
.... 其他的参数
}

其他 sdk其他功能均通过万能接口的方式完成,万能接口的函数为req() 例子(这是一个检查订单是否完成的方法)

JSONObject json = new JSONObject();
json.put("op", "check_order");
json.put("ordierid", data.getString("orderid"));
Sdk.req(json.toString());

调用后,在sdk检测完成后,在设置的handle将会接收到类似下面的消息: msg.what == 0: 支付完成,msg.obj为以下的格式:

{
"op":"check_order",
"ret":0
.... 其他的参数
}

mag.what != 0: 支付出现问题,msg.obj为以下的格式:

{
"op":"check_order",
"ret":-1 //或者其他值,但不是0
.... 其他的参数
}

检查是否有广告

JSONObject json = new JSONObject();
json.put("op", "has_ad");
Sdk.req(json.toString());

调用后,将在设置的handle将会接收到类似下面的消息(如果启用了全屏广告,即使没有调用has_ad请求也会收到以下消息): msg.what == 0: 有广告

{
"op":"has_ad",
"ret":0
.... 其他的参数
}
msg.what != 0: 无广告

显示广告

JSONObject json = new JSONObject();
json.put("op", "show_ad");
Sdk.req(json.toString());

调用后,将在设置的handle将会接收到类似下面的消息: msg.what == 0: 有广告并且显示

{
"op":"show_ad",
"ret":0
.... 其他的参数
}

msg.what != 0: 无广告或者广告已经被显示过了。

其他的操作有"hide_button", "show_button", "logout"等等。

第六步: 发布

发布的时候,如果使用代码混淆的话,务必将下列语句添加到混淆文件中(一般为项目代码下的proguard-project.txt文件) SDK的jar包中的所有类不得混淆。否则在执行时会碰到错误

-keep class com.rodcell.rcsdk.**{ *; }
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}
# Keep the names of classes/members we need for client functionality.
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}
# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}