cocos2dx接百度定位SDK(Android)

步驟:

第一步:

到百度地圖開發平臺申請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!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章