接入SDK

突然要接SDK,有点懵,对安卓也是一点都不懂,完全没经验,弄了好几天,终于有点反应了,总结下。



******************前置**********************
1.项目的代码主要是两块,一块C++的,一块JAVA的,C++的其实与接入SDK没有关系,
所以说JNI啥的其实可以不用知道。接SDK不用关注。接入主要代码是在JAVA块。
******************接入SDK**********************
1.先确定未接入SDK之前的项目能正常运行。
2.将Demo中的(libs,,proguard,res,src)目录中的文件都复制到项目相应的目录下。
libs是要导入的JAR,res是SKD要用到的资源,(自己项目的资源应该是在C++那块——猜测),
src是SDK要用到的.java文件。Proguard文件夹是一个混淆工具。


2.添加jar文件不仅仅是复制古偶去,还要在build path加入
(右键项目->build path->configure build path),然后到里面配置。
  资源文件直接复制到项目中的res文件下,而不是项目所在文件的res下


3.复制配置文件(将SDK中的配置文件中信息复制到项目中,注意其中的项目路径,有些地方需要更改,
要根据实际情况添加)


4.主要内容都在demo中的一个类中(名字中有main的类里),然后从其中添加至自己的类中。
******************报错信息**********************
1.R文件报错,R文件报错基本都是配置文件存在问题,配置文件有问题就会使得不能正常生成R文件,将R文件中的
错误修正之后就能生成R文件了。如果还不行,就手动生成:R文件->项目->右键->Android Tool->Fix project properties


2.如果从SDK中复制过来的JAVA文件报错,是.R文件的,可以注释掉,不用管。


3.Eclipes在执行某一项操作时,如果取消了,可能会报错(command canceled)


4.Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE,安装失败
卸载掉原来的软件(如果还不行,就是没卸载干净,1.可能是存在相同软件,但接入的是不同的SDK这种,
我就是这种情况,把其他的都删除就行了,2也可能是卸载掉了软件,但没删除相应的文件夹,具体方法百度)


5.签名错误。在接SDK时,一直返回签名,完全不知道什么错。后来问了同时,这个要重新配置个文件,大概
类似debug.keystore.


6.包名要按照一定的规则。


7.如果整个项目报错,而在目录下看不到错误,则应该是环境的问题.右键项目->属性,然后到里面找


8.苹果导入debug.keystore方法:先选中eclipes->然后左边的eclipse->偏好设置->Android-build


******************关于安卓**********************
1.Handler对象
http://mobile.51cto.com/aprogram-442833.htm


2.在配置文件中有描述了首先启动了哪个activity,里面含这种
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />


******************未知**********************
假如是C++代码先启动,然后调用了JNI中的login,通过Handle发送了一个消息,但是JAVA中的mainActivit
是什么时候启动的。这个还不知道。








/** * 初始化SDK */ private static void initSDK(String appid, String appkey) { ProxySelector defaultProxySelector = ProxySelector.getDefault(); Proxy proxy = null; List<Proxy> proxyList = null; try { proxyList = defaultProxySelector.select(new URI( "http://www.google.it")); } catch (URISyntaxException e) { e.printStackTrace(); } if (proxyList != null && proxyList.size() > 0) { proxy = proxyList.get(0); Log.d(TAG, "Current Proxy Configuration: " + proxy.toString()); } AppInfo appInfo = new AppInfo(); appInfo.setAppId(appid);// 应用ID appInfo.setAppKey(appkey);// 应用Key appInfo.setCtx(ctx); /* * VersionCheckLevelNormal 版本检查失败可以继续进行游戏 VersionCheckLevelStrict * 版本检查失败则不能进入游戏 默认取值为VersionCheckLevelStrict */ appInfo.setVersionCheckStatus(AppInfo.VERSION_CHECK_LEVEL_STRICT); // 初始化SDK Commplatform.getInstance().Init(0, appInfo, new CallbackListener<Integer>() { @Override public void callback(final int paramInt, Integer paramT) { ctx.runOnUiThread(new Runnable() { @Override public void run() { Log.i(TAG, "Init paramInt = " + paramInt); // ok.setEnabled(true); LogUtil.send("初始化: " + paramInt); } }); } }); } /** * 用户登录 * */ public static void loginEx(Context context) { Bundle bundle = new Bundle(); bundle.putString("nounce", UUID.randomUUID().toString() .replace("-", "")); Commplatform.getInstance().LoginEx(context, bundle, new CallbackListener<Bundle>() { @Override public void callback(int resultCode, Bundle bundle) { if (resultCode == ErrorCode.COM_PLATFORM_SUCCESS) { // 完成参数验签 // 处理登录成功逻辑 // HomeActivity.show(ctx); // String uin= bundle.getString("uin"); LogUtil.send("登录成功 :"); // String uin= bundle.get("nounce").toString(); String uin = Commplatform.getInstance() .getLoginUin(); LogUtil.send("登录成功 uin :" + uin); UnityPlayer.UnitySendMessage("MainScript", "HuaweiLoginBack", uin); } else { // 处理登录失败逻辑 LogUtil.send("登录失败"); } } }); } /** * 充值 * */ public static int pay(String currency) { isPaying = true; Payment payment = new Payment(); ProductBean productBean = productMap.get(currency); makeSerial(); payment.setTradeNo(orderKen); payment.setProductId(productBean.getProductId()); payment.setSubject(productBean.getTitle()); payment.setDesc(productBean.getDescription()); payment.setAmount(productBean.getPrice_amount()); payment.setCurrency(productBean.getPrice_currency_code()); payment.setNote(""); payment.setNotifyURL(""); payment.setThirdAppId(id); payment.setThirdAppName("Spot Battle"); payment.setThirdAppPkgname("com.testcrecool.mi"); final String tradeNo = payment.getTradeNo(); final String productId = payment.getProductId(); // 将订单的详细信息插入数据库 PaymentTableAdapter.insert(ctx, payment); int res = Commplatform.getInstance().UniPayExt(payment, ctx, new CallbackListener<PayResult>() { @Override public void callback(final int code, final PayResult arg1) { ctx.runOnUiThread(new Runnable() { public void run() { // 回调结果,即支付过程结束 isPaying = false; LogUtil.send("回调结果,即支付过程结束 code: " + code); if (code == ErrorCode.COM_PLATFORM_SUCCESS) { // TODO Example 1 // 根据final 的 productID 或者 orderId // 去处理商品,比如查询道具,发放道具等 // TODO Example 2 // 可以根据订单号查询订单详细信息,在做订单的处理,比如查询道具,发放道具等 // 如下: Payment payment = PaymentTableAdapter .queryByOrderId(ctx, orderKen); // 购买有结果,即删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, orderKen); Log.i(TAG, "COM_PLATFORM_SUCCESS"); LogUtil.send("成功"); UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", orderKen); } else if (code == ErrorCode.COM_PLATFORM_ERROR_PAY_FAILURE) { Log.i(TAG, "COM_PLATFORM_ERROR_PAY_FAILURE"); } else if (code == ErrorCode.COM_PLATFORM_ERROR_PAY_CANCEL) { // 购买失败 // 购买有结果,即删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, tradeNo); Log.i(TAG, "COM_PLATFORM_ERROR_PAY_CANCEL"); UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else if (code == ErrorCode.COM_PLATFORM_ERROR_PAY_CANCEL) { LogUtil.send("取消购买"); // 取消购买 // 购买有结果,即删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, tradeNo); UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else { LogUtil.send("Purchase failed. Error code:" + code); Log.i(TAG, "COM_PLATFORM_ERROR_UNKNOWN"); } } }); } }); if (res == 0) { LogUtil.send("000"); return 0; } else { // 返回错误,即支付过程结束 isPaying = false; LogUtil.send("返回错误,即支付过程结束"); return -1; } } /** * 获取应用内商品信息 **/ public static void querySkuDetail() { Commplatform.getInstance().getSkuDetails(ctx, new CallbackListener<List<SkuDetail>>() { @Override public void callback(int errorCode, List<SkuDetail> skuDetails) { if (errorCode == ErrorCode.COM_PLATFORM_SUCCESS && skuDetails != null) { for (SkuDetail detail : skuDetails) { ProductBean prBean = new ProductBean(); prBean.setProductId(detail.productId); prBean.setPrice(detail.price); prBean.setPrice_amount(detail.price_amount); prBean.setPrice_currency_code(detail.price_currency_code); prBean.setTitle(detail.title); prBean.setDescription(detail.description); productMap.put(detail.productId, prBean); } // showText.setText(buffer.toString()); LogUtil.send("获取应用内商品信息"); } else { // showText.setText("query error"); LogUtil.send("query error"); } } }); } /** * 生成订单号 * */ private static String makeSerial() { // 生成订单号 orderKen = UUID.randomUUID().toString().replaceAll("-", ""); return orderKen; } // 同步支付订单的漏单查询接口调用 private static void checkPay(final Payment paymentSerial) { QueryPayment queryPayment = new QueryPayment(); queryPayment.setTradeNo(paymentSerial.getTradeNo()); queryPayment.setThirdAppId(paymentSerial.getThirdAppId()); final String tradeNo= queryPayment.getTradeNo(); Commplatform.getInstance().queryPayment(queryPayment, ctx, new CallbackListener<PaymentState>() { @Override public void callback(int paramInt, PaymentState paramT) { if (paramInt == ErrorCode.COM_PLATFORM_SUCCESS) { // Step2:订单查询成功 从数据库删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx,tradeNo); // 订单支付成功,可以根据订单号查询订单详细信息,在做订单的处理,比如查询道具,发放道具等 // TODO… 游戏代码 LogUtil.send("漏单查询成功!!!"); UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", orderKen); } else if (paramInt == ErrorCode.COM_PLATFORM_ERROR_UNEXIST_ORDER) { // Step2:订单不存在 从数据库删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, tradeNo); // 根据游戏自身的体验决定如何处理 UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else if (paramInt == ErrorCode.COM_PLATFORM_ERROR_PAY_FAILURE) { // Step2:订单支付失败 从数据库删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, tradeNo); // 根据游戏自身的体验决定如何处理 UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else if (paramInt == ErrorCode.COM_PLATFORM_ERROR_SERVER_RETURN_ERROR) { // Step2:服务端返回错误 从数据库删除此订单号 PaymentTableAdapter.deleteByOrderId(ctx, tradeNo); // 根据游戏自身的体验决定如何处理 UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else if (paramInt == ErrorCode.COM_PLATFORM_ERROR_PAY_REQUEST_SUBMITTED) { // 订单已提交 // 根据游戏自身的体验决定如何处理 // 后续还需要继续查询 UnityPlayer.UnitySendMessage("MainScript", "hwPayCallback", "error"); } else { // 未知错误 // 根据游戏自身的体验决定如何处理 // 后续还需要继续查询 } } }); }
在Cocos引擎中接入SDK(软件开发工具包)通常是为了扩展游戏的功能,如支付、社交分享、广告等。以下是一个基本的步骤指南,帮助你在Cocos项目中接入SDK: ### 1. 准备工作 - **下载SDK**:从SDK提供商的官网下载适用于Cocos引擎的SDK包。 - **阅读文档**:仔细阅读SDK的集成文档,了解其提供的功能和使用方法。 ### 2. 将SDK添加到项目中 - **解压SDK包**:将下载的SDK包解压到一个临时目录。 - **复制文件**:将SDK包中的必要文件(如`.jar`、`.so`、`.a`等)复制到Cocos项目的相应目录中。通常,这些文件会被放置在`proj.android/libs`、`proj.android/app/jni`等目录下。 ### 3. 配置项目文件 - **修改`build.gradle`**:在`build.gradle`文件中添加SDK的依赖项。例如: ```groovy dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.sdk.provider:name:version' } ``` - **修改`AndroidManifest.xml`**:根据SDK文档的要求,添加必要的权限和活动声明。例如: ```xml <uses-permission android:name="android.permission.INTERNET"/> <application> <activity android:name="com.sdk.provider.ActivityName"/> </application> ``` ### 4. 初始化SDK - **编写初始化代码**:在Cocos项目中,找到合适的位置(如`AppDelegate.cpp`)编写初始化SDK代码。例如: ```cpp #include "sdk_header.h" bool AppDelegate::applicationDidFinishLaunching() { // 其他初始化代码 sdk::init(); return true; } ``` ### 5. 调用SDK功能 - **调用SDK提供的接口**:根据需要调用SDK提供的各种功能接口。例如,调用支付接口: ```cpp sdk::pay("product_id", "callback_url"); ``` ### 6. 测试与调试 - **编译项目**:编译并运行项目,确保SDK功能正常。 - **调试问题**:如果出现问题,查看日志文件并进行调试,确保所有配置和代码都正确无误。 ### 7. 打包与发布 - **打包项目**:完成所有配置和测试后,打包项目并发布。 通过以上步骤,你可以在Cocos项目中成功接入SDK。根据不同的SDK,具体的步骤和配置可能会有所不同,请务必参考SDK提供商的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值