1:根据百度官方文档配置后台
2:c++代码
a:LexLocation.hpp
#PRagma once
#include <string>
#include <functional>
namespace Lex
{
void InitLocation();
bool GetCity(std::function<void(std::string)> OnLocationResult);
}
b:LexLocation.cpp
#include "LexLocation.hpp"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"
static std::function<void(std::string)> OnLocationResult;
namespace Lex
{
void OnResult(std::string city)
{
if (OnLocationResult) OnLocationResult(city);
OnLocationResult = nullptr;
}
extern"C" {
void java_lexlib_bdLocate_BDLocateCall_Result(JNIEnv *env, jobject obj, jstring jresult)
{
std::string result = env->GetStringUTFChars(jresult,nullptr);
CCLOG("11111111111111111111111111111111111%s", result.data());
OnResult(result);
}
}
bool Locate()
{
cocos2d::JniMethodInfo payM;
bool isHave = cocos2d::JniHelper::getStaticMethodInfo(payM,"lexlib/bdLocate/BDLocateCall","StartLocate",
"()V");
bool resulte =false;
if (isHave)
{
payM.env->CallStaticVoidMethod(payM.classID, payM.methodID);
}
else
{
return false;
CCLOG("get StartLocate function is fail");
}
returntrue;
}
void InitLocation()
{
cocos2d::JniMethodInfo payM;
bool isHave = cocos2d::JniHelper::getStaticMethodInfo(payM,"lexlib/bdLocate/BDLocateCall","InitLocation",
"()V");
if(isHave)
{
payM.env->CallStaticVoidMethod(payM.classID, payM.methodID);
}
else
{
CCLOG("get InitLocation function is fail");
}
}
bool GetCity(std::function<void(std::string)> _OnLocationResult)
{
OnLocationResult = _OnLocationResult;
return Locate();
}
}
3:java代码
a:BDLocateCall.javapackage lexlib.bdLocate;
import org.cocos2dx.cpp.AppActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.R.bool;
import android.util.Log;
public class BDLocateCall {
publicstatic void InitLocation()
{
AppActivity.mainAct.runOnUiThread(new Runnable(){
publicvoid run()
{
BDLocateSDK.initLocation();
}
});
}
publicstatic void StartLocate()
{
Log.v("333333","66666666666");
AppActivity.mainAct.runOnUiThread(new Runnable(){
publicvoid run()
{
BDLocateSDK.start();
}
});
}
publicstatic void _Result(final String res)
{
Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable()
{
publicvoid run()
{
Result(res);
}
});
}
nativepublic staticvoid Result(String city);
}
b:BDLocateSDK.javapackage lexlib.bdLocate;
import android.app.Activity;
import java.util.List;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
//import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
import com.baidu.location.Poi;
import android.util.Log;
public class BDLocateSDK {
publicstatic LocationClient mLocationClient =null;
publicstatic Activity act = null;
publicstatic class MyLocationListenerimplements BDLocationListener
{
@Override
publicvoid onReceiveLocation(BDLocation location)
{
//Receive Location
StringBuffer sb = new StringBuffer(256);
if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果
sb.append(location.getProvince());
sb.append(".");
sb.append(location.getCity());
BDLocateCall._Result(sb.toString());
} elseif (location.getLocType() == BDLocation.TypeNetWorkLocation){//网络定位结果
sb.append(location.getProvince());
sb.append(".");
sb.append(location.getCity());
BDLocateCall._Result(sb.toString());
} elseif (location.getLocType() == BDLocation.TypeOffLineLocation) {//离线定位结果
BDLocateCall._Result(sb.toString());
} else {
String s = " ";
s = s + location.getLocType();
Log.v("222222", s);
}
}
}
publicstatic void init(Activity activity )
{
act = activity;
}
publicstatic void initLocation()
{
if(mLocationClient ==null)
{
mLocationClient = new LocationClient(act);
final BDLocationListener listener =new MyLocationListener();
mLocationClient.registerLocationListener(listener);
}
LocationClientOption option =new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span=0;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
mLocationClient.setLocOption(option);
}
publicstatic void start()
{
mLocationClient.start();
}
}
新闻热点
疑难解答