背景
项目使用cocos2d-x引擎,客户端语言是lua,项目需要使用多人定位,配合服务端使用,只需要客户端这边获取到经纬度信息并传给服务端就ok了,所以也只需要高德定位sdk.
步骤
1. 在高德开放平台上注册并下载jar包,高德忘账号了就不贴步骤图了,这是我下载好的,放在android的libs文件夹下
2. 配置高德 key
在AndroidManifest.xml文件中增加以下代码
然后声名权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
3. 在AppActivity.java里面添加代码
引入部分
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;
import com.amap.api.location.AMapLocationListener;
声明部分
private AMapLocationClient locationClient = null;//声明AMapLocationClient类对象
private AMapLocationClientOption locationOption = new AMapLocationClientOption();//声明并初始化AMapLocationClientOption对象
static private String LocationInfo = "";
函数部分
private void initLocation(){
//初始化client
locationClient = new AMapLocationClient(this.getApplicationContext());
//设置定位参数
locationClient.setLocationOption(getDefaultOption());
// 设置定位监听
locationClient.setLocationListener(locationListener);
//启动定位
locationClient.startLocation();
}
private AMapLocationClientOption getDefaultOption(){
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(30000);//可选,设置定位间隔。默认为30秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
return mOption;
}
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (location != null) {
if (location.getErrorCode() == 0) {
StringBuffer sb = new StringBuffer(256);
//sb.append("\n纬度:");
sb.append(location.getLatitude());
sb.append(",");
//sb.append("\经度:");
sb.append(location.getLongitude());
LocationInfo = sb.toString();
Log.d("LOC", LocationInfo);
}else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"
+ location.getErrorCode() + ", errInfo:"
+ location.getErrorInfo());
}
}
}
};
public static String getLocationInfomation() {
return LocationInfo;
}
并在onCreate中调用 initLocation()
4. 在lua中使用
function User:OnLocationAndroid()
print('User:OnLocationAndroid')
local argsJson = nil
local sigs = "()Ljava/lang/String;"
local className = "com/xxx/xxx/AppActivity"
local luaj = require("cocos.cocos2d.luaj")
local ok,ret = luaj.callStaticMethod(className, "getLocationInfomation", nil, sigs)
if not ok then
print('==== luaj error ==== : ', ret)
else
print('==== The JNI return is:', ret)
if ret == nil or #ret == 0 then
return
end
local str = tostring(ret)
local splitlist = {}
string.gsub(str, '[^,]+', function(w) table.insert(splitlist, w) end )
dump(splitlist);
local app = require("app.App"):instance()
local login = app.session.login
login:sendLocation(splitlist[1], splitlist[2]) --这里就获取到经纬度的值了
return
end
end
完成!