步驟:
第一步:
到百度地圖開發平臺申請AK,SHA1獲得方式如圖
第二步:
下載SDK:BaiduLBS_AndroidSDK_Lib,把文件夾內容拷貝到工程/proj.android/libs目錄下
第三步:
在AndroidManifest.xml的application下添加
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="自己項目的AK" >
</meta-data>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
<!-- 這個權限用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個權限用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網絡,網絡定位需要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權限,用戶寫入離線定位數據-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
第四步:
在AppActivity.java中添加
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.Poi;
public class AppActivity extends Cocos2dxActivity {
// 百度定位
public static LocationClient mLocationClient = null;
private static MyLocationListener myListener = null;
public static native void Result(String res);
//----------百度定位功能開始--------
// 初始化
public static void InitLocation()
{
if(mLocationClient == null)
{
mLocationClient = new LocationClient(AppActivity.getInstance());
myListener = new MyLocationListener();
mLocationClient.registerLocationListener(myListener);
}
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
}
// 開始定位
public static void StartLocate()
{
mLocationClient.start();
}
// 回調結果
public static class MyLocationListener implements BDLocationListener
{
@Override
public void onReceiveLocation(BDLocation location)
{
double latitude = location.getLatitude(); //獲取緯度信息
double longitude = location.getLongitude(); //獲取經度信息
float radius = location.getRadius(); //獲取定位精度,默認值爲0.0f
String coorType = location.getCoorType(); //獲取經緯度座標類型
int errorCode = location.getLocType(); //獲取定位類型、定位錯誤返回碼
Result(latitude, longitude);
}
}
//----------百度定位功能結束--------
}
第五步:
在Android.mk中添加
#####################################################
include $(CLEAR_VARS)
LOCAL_MODULE := liblocSDK7b
LOCAL_SRC_FILES := ../../Classes/Core/Utils/PhoneUtils/android/BaiduLBS/libs/Android/$(TARGET_ARCH_ABI)/liblocSDK7b.so
include $(PREBUILT_SHARED_LIBRARY)
#####################################################
# _COCOS_LIB_ANDROID_BEGIN
#####################################################
LOCAL_SHARED_LIBRARIES += liblocSDK7b
#####################################################
# _COCOS_LIB_ANDROID_END
第六步:
C++代碼
#include "LocationManager.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif
void LocationManager::OnResult(double latitude, double longitude)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
if (OnLocationResult) OnLocationResult(latitude, longitude);
OnLocationResult = nullptr;
#endif
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C" {
void Java_org_cocos2dx_cpp_AppActivity_Result(JNIEnv *env, jobject obj, jstring jresult)
{
std::string result = env->GetStringUTFChars(jresult, nullptr);
LocationManager::getInstance()->OnResult(result);
}
}
#endif
bool Locate()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
cocos2d::JniMethodInfo payM;
bool isHave = cocos2d::JniHelper::getStaticMethodInfo(payM, "org/cocos2dx/cpp/AppActivity", "StartLocate", "()V");
bool resulte = false;
if (isHave)
{
payM.env->CallStaticVoidMethod(payM.classID, payM.methodID);
}
else
{
return false;
CCLOG("get StartLocate function is fail");
}
#endif
return true;
}
void LocationManager::InitLocation()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
cocos2d::JniMethodInfo payM;
bool isHave = cocos2d::JniHelper::getStaticMethodInfo(payM, "org/cocos2dx/cpp/AppActivity", "InitLocation","()V");
if (isHave)
{
payM.env->CallStaticVoidMethod(payM.classID, payM.methodID);
}
else
{
CCLOG("get InitLocation function is fail");
}
#endif
}
bool LocationManager::GetCity(std::function<void(std::string)> _OnLocationResult)
{
InitLocation();
OnLocationResult = _OnLocationResult;
return Locate();
}
第七步:
OJBK!