项目推广的时候,运营希望游戏里面越多可以散发的地方越好,于是有了直接在游戏里面发短信邀请通讯录好友打游戏的需求,下面记录一下。
在cocos项目里面做这种手机系统的功能,思路就是跨平台分别调用各自系统的接口来实现获取通讯录和发送短信。cocos工程里面的跨平台写法大致跟我之前写的复制功能差不多,但是具体实现的时候,获取通讯录和发短信稍微麻烦一点,需要获取权限,有操作回调,有界面的一些处理,所以需要根据不同项目做不同的处理。
跟复制功能一样,为了方便,我直接写在了Application里面。win平台的接口实现跟复制功能差不多,就不说了,主要说一下ios和安卓。
在ApplicationProtocol里面添加接口
//发短信,这里的参数name实际在安卓和苹果的发短信函数里面暂时都用不到,是之前设计接口的时候多写了的,就当做预留参数了,亲们写的时候没有特别的需求不用传name字段。
virtual bool sendMsgFromContactPicker(const std::string &name, const std::string &phoneNum, const std::string &msgContent)= 0;
//获取通讯录
virtual std::string getContactPicker()
获取通讯录的接口的返回值设计成字符串类型是因为,在获取到系统的通讯录之后,我把所有数据存成了json返回给c++处理界面,这样操作就不管ios和安卓系统本身拿到的数据是神马类型,都方便和win下c++传递数据。
安卓在jni文件夹下Java_org_cocos2dx_lib_Cocos2dxHelper文件里实现jni的接口:
//获取通讯录
extern std::string getContactPickerJNI() {
JniMethodInfo t;
std::string ret("");
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getContactPicker", "()Ljava/lang/String;")) {
jstring str = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
ret = JniHelper::jstring2string(str);
t.env->DeleteLocalRef(str);
}
return ret;
}
//发送短信
extern bool sendMsgFromContactPickerJNI(const char* name, const char* phoneNum, const char* msgContent) {
JniMethodInfo t;
bool ret = false;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "sendMsgFromContactPicker", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z")) {
jstring stringName = t.env->NewStringUTF(name);
jstring stringPhoneNum = t.env->NewStringUTF(phoneNum);
jstring stringMsgContent = t.env->NewStringUTF(msgContent);
ret = t.env->CallStaticBooleanMethod(t.classID, t.methodID, stringName, stringPhoneNum, stringMsgContent);
t.env->DeleteLocalRef(t.classID);
t.env->DeleteLocalRef(stringName);
t.env->DeleteLocalRef(stringPhoneNum);
t.env->DeleteLocalRef(stringMsgContent);
}
return ret;
}
在CCApplication-android里写调用jni的接口:
std::string Applicati