cocos项目中加入高德定位 android篇

本文介绍如何在使用Cocos2d-x和Lua的游戏项目中集成高德定位SDK,实现客户端经纬度信息获取,并将数据传递给服务端。包括注册下载SDK、配置权限、修改AppActivity代码及在Lua中调用等详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景
项目使用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

完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值