百度定位sdk接入

本文介绍了如何将百度定位SDK集成到C++和Java混合开发的项目中,包括C++的LexLocation.hpp和LexLocation.cpp文件的代码示例,以及Java端BDLocateCall类的详细步骤,涉及初始化、启动定位和接收定位结果的方法。

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

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");

}

return true;


}


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.java

package lexlib.bdLocate;


import org.cocos2dx.cpp.AppActivity;

import org.cocos2dx.lib.Cocos2dxGLSurfaceView;


import android.R.bool;

import android.util.Log;


public class BDLocateCall {

public static void InitLocation()

    {

    AppActivity.mainAct.runOnUiThread(new Runnable(){

    public void run() 

{

BDLocateSDK.initLocation();

}

    });

    }

public static void StartLocate()

{

Log.v("333333", "66666666666");

AppActivity.mainAct.runOnUiThread(new Runnable(){

    public void run() 

{

  BDLocateSDK.start();

}

    });

}

    

    public static void _Result(final String res)

    {

    Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable()

{

      public void run()

      {

      Result(res);

      }

});

    }

    

    native public static void Result(String city);

}

b:BDLocateSDK.java

package 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 {

public static LocationClient mLocationClient = null;

public static Activity act = null;

public static class MyLocationListener implements BDLocationListener 

{

 

        @Override

        public void 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());

                

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果

            sb.append(location.getProvince());

                sb.append(".");

                sb.append(location.getCity());

                BDLocateCall._Result(sb.toString());

                

            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果

                BDLocateCall._Result(sb.toString());

            } else {

            String s = " ";

            s = s + location.getLocType();

            Log.v("222222", s);

            }

        }

            

}

public static void init(Activity activity )

{

act = activity;

}

public static 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);

}

public static void start()

{

mLocationClient.start();

}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值