有关Cocos项目里面接入高德SDK的方式

时间:2024-05-20 13:08:57

1.有关高德开放平台的审核工作


首先就是要注册账号,分为个人开发者和企业开发者两种身份,企业开发者审核期为三天,权限和服务也会更多。然后创建自己的应用,填写信息,如下:
有关Cocos项目里面接入高德SDK的方式
有关SHA1等信息可以在项目里面查看:
有关Cocos项目里面接入高德SDK的方式
点击Preferences
有关Cocos项目里面接入高德SDK的方式
这里有两个keystore,一个是debug版本的,另一个是release版本的,有关keystore文件的生成请点击:传送门
然后把release的keystore信息填写到高德上就可以得到一个key值了。接下来就是要写代码了


2.项目配置


添加jar包
从官网上面下载jar包等开发工具,然后导入到项目的libs文件夹下面(eclipse),然后右击,如图所示:
有关Cocos项目里面接入高德SDK的方式

接下来需要配置AndroidManifest.xml文件。

为了保证高德 Android SDK 的功能正常使用,您需要申请高德 Key 并且配置到项目中。

项目的 “AndroidManifest.xml” 文件中,添加如下代码:

[java] view plain copy
 print?
  1. <application  
  2.          android:icon="@drawable/icon"  
  3.          android:label="@string/app_name" >  
  4.          <meta-data  
  5.             android:name="com.amap.api.v2.apikey"  
  6.             android:value="请输入您的用户Key"/>  
  7.             ……  
  8. </application>  

首先,声明Service组件

请在application标签中声明service组件,每个app拥有自己单独的定位service。

1
<service android:name="com.amap.api.location.APSService"></service>

然后,声明权限

Android 6.0及以上系统可以参考Android 6.0权限说明章节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--用于写入缓存数据到扩展存储卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

接下来需要在org.cocos2dx.lua.AppActivity里面添加初始代码(由于这是一个获取位置的小Demo,目前只有满足需求的部分代码,后续增加功能的话,其余功能代码会陆续加上来)

先贴上代码:
[java] view plain copy
 print?
  1. /**************************************************************************** 
  2. Copyright (c) 2008-2010 Ricardo Quesada 
  3. Copyright (c) 2010-2012 cocos2d-x.org 
  4. Copyright (c) 2011      Zynga Inc. 
  5. Copyright (c) 2013-2014 Chukong Technologies Inc. 
  6.   
  7. http://www.cocos2d-x.org 
  8.  
  9. Permission is hereby granted, free of charge, to any person obtaining a copy 
  10. of this software and associated documentation files (the "Software"), to deal 
  11. in the Software without restriction, including without limitation the rights 
  12. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
  13. copies of the Software, and to permit persons to whom the Software is 
  14. furnished to do so, subject to the following conditions: 
  15.  
  16. The above copyright notice and this permission notice shall be included in 
  17. all copies or substantial portions of the Software. 
  18.  
  19. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  20. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  21. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
  22. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  23. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
  24. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
  25. THE SOFTWARE. 
  26. ****************************************************************************/  
  27. package org.cocos2dx.lua;  
  28.   
  29. import org.cocos2dx.lib.Cocos2dxActivity;  
  30. import android.os.Bundle;  
  31. import android.util.Log;  
  32. import android.content.Intent;  
  33.   
  34. import com.amap.api.location.AMapLocation;  
  35. import com.amap.api.location.AMapLocationClient;  
  36. import com.amap.api.location.AMapLocationClientOption;  
  37. import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;  
  38. import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;  
  39. import com.amap.api.location.AMapLocationListener;  
  40. import com.anysdk.framework.PluginWrapper;  
  41.   
  42. public class AppActivity extends Cocos2dxActivity {  
  43.   
  44.   
  45.     private AMapLocationClient locationClient = null;  
  46.     private AMapLocationClientOption locationOption = new AMapLocationClientOption();  
  47.     private String LocationInfo;   
  48.     @Override  
  49.     protected void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.   
  52.         initLocation();  
  53.         //for anysdk  
  54.         PluginWrapper.init(this);  
  55.     }  
  56.       
  57.     public String GetInfo()  
  58.     {  
  59.         return LocationInfo;  
  60.     }  
  61.       
  62.     /** 
  63.      * 初始化定位 
  64.      */  
  65.     private void initLocation(){  
  66.         //初始化client  
  67.         locationClient = new AMapLocationClient(this.getApplicationContext());  
  68.         //设置定位参数  
  69.         locationClient.setLocationOption(getDefaultOption());  
  70.         // 设置定位监听  
  71.         locationClient.setLocationListener(locationListener);  
  72.         //启动定位  
  73.         locationClient.startLocation();  
  74.     }  
  75.       
  76.     AMapLocationListener locationListener = new AMapLocationListener() {  
  77.         @Override  
  78.         public void onLocationChanged(AMapLocation location) {  
  79.             if (location != null) {  
  80.                 if (location.getErrorCode() == 0) {  
  81.                     StringBuffer sb = new StringBuffer(256);  
  82.                     sb.append("时间: ");  
  83.                     sb.append(location.getTime());  
  84.                     sb.append("\n纬度:");  
  85.                     sb.append(location.getLatitude());  
  86.                     sb.append("\n纬度:");  
  87.                     sb.append(location.getLongitude());  
  88.                     sb.append("\n精度:");  
  89.                     sb.append(location.getAccuracy());  
  90.                     sb.append("\n地址:");  
  91.                     sb.append(location.getAddress());  
  92.                     sb.append("\n国家信息:");  
  93.                     sb.append(location.getCountry());  
  94.                     sb.append("\n省信息:");  
  95.                     sb.append(location.getProvince());  
  96.                     sb.append("\n城市信息:");  
  97.                     sb.append(location.getCity());  
  98.                     sb.append("\n城区信息:");  
  99.                     sb.append(location.getDistrict());  
  100.                     sb.append("\n街道信息:");  
  101.                     sb.append(location.getStreet());  
  102.                     sb.append("\n街道门牌号信息:");  
  103.                     sb.append(location.getStreetNum());  
  104.                     sb.append("\n城市编码:");  
  105.                     sb.append(location.getCityCode());  
  106.                     sb.append("\n地区编码:");  
  107.                     sb.append(location.getAdCode());  
  108.                     sb.append("\n定位点AOI信息:");  
  109.                     sb.append(location.getAoiName());  
  110.                     LocationInfo = sb.toString();  
  111.                     Log.d("LOC", LocationInfo);  
  112.                 }else {  
  113.                 //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。  
  114.                 Log.e("AmapError","location Error, ErrCode:"  
  115.                     + location.getErrorCode() + ", errInfo:"  
  116.                     + location.getErrorInfo());  
  117.                 }  
  118.             }  
  119.         }  
  120.     };  
  121.       
  122.     /** 
  123.      * 默认的定位参数 
  124.      */  
  125.     private AMapLocationClientOption getDefaultOption(){  
  126.         AMapLocationClientOption mOption = new AMapLocationClientOption();  
  127.         mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式  
  128.         mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭  
  129.         mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效  
  130.         mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒  
  131.         mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true  
  132.         mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false  
  133.         mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用  
  134.         AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP  
  135.         mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false  
  136.         mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差  
  137.         mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true  
  138.         return mOption;  
  139.     }  
  140.       
  141.       
  142.     @Override  
  143.     protected void onActivityResult(int requestCode, int resultCode, Intent data){  
  144.         super.onActivityResult(requestCode, resultCode, data);  
  145.         PluginWrapper.onActivityResult(requestCode, resultCode, data);  
  146.     }  
  147.     @Override  
  148.     protected void onResume() {  
  149.         super.onResume();  
  150.         PluginWrapper.onResume();  
  151.     }  
  152.     @Override  
  153.     public void onPause(){  
  154.         PluginWrapper.onPause();  
  155.         super.onPause();  
  156.     }  
  157.     @Override  
  158.     protected void onNewIntent(Intent intent) {  
  159.         PluginWrapper.onNewIntent(intent);  
  160.         super.onNewIntent(intent);  
  161.     }  
  162. }  

[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>private AMapLocationClient locationClient = null;//<span style="color: rgb(0, 131, 18); font-family: Menlo, Consolas, monospace; white-space: nowrap;">声明AMapLocationClient类对象</span>  
  2.     private AMapLocationClientOption locationOption = new AMapLocationClientOption();//<span style="color: rgb(0, 131, 18); font-family: Menlo, Consolas, monospace; white-space: nowrap;">声明并初始化AMapLocationClientOption对象</span>  
  3.     private String LocationInfo;//保存获取到的地址信息  

下面是有关定位模式的信息:

选择定位模式

高德定位服务包含GPS和网络定位(Wi-Fi和基站定位)两种能力。定位SDK将GPS、网络定位能力进行了封装,以三种定位模式对外开放,SDK默认选择使用高精度定位模式。

高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息。

1
2
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);

低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);

1
2
//设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。
mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);

仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,自 v2.9.0 版本支持返回地址描述信息。

1
2
//设置定位模式为AMapLocationMode.Device_Sensors,仅设备模式。
mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);

设置单次定位

如果您需要使用单次定位,需要进行如下设置:

1
2
3
4
5
6
7
8
9
//获取一次定位结果:
//该方法默认为false。
mLocationOption.setOnceLocation(true);
 
//获取最近3s内精度最高的一次定位结果:
//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
mLocationOption.setOnceLocationLatest(true);
 
}

自定义连续定位

SDK默认采用连续定位模式,时间间隔2000ms。如果您需要自定义调用间隔:

1
2
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000);

其他参数

设置定位同时是否需要返回地址描述。

1
2
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);

设置是否强制刷新WIFI,默认为强制刷新。每次定位主动刷新WIFI模块会提升WIFI定位精度,但相应的会多付出一些电量消耗。

1
2
//设置是否强制刷新WIFI,默认为true,强制刷新。
mLocationOption.setWifiActiveScan(false);

设置是否允许模拟软件Mock位置结果,多为模拟GPS定位结果,默认为false,不允许模拟位置。

1
2
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);

设置定位请求超时时间,默认为30秒。

注意:自 V3.1.0 版本之后setHttpTimeOut(long httpTimeOut)方法不仅会限制低功耗定位、高精度定位两种模式的定位超时时间,同样会作用在仅设备定位时。如果单次定位发生超时情况,定位随即终止;连续定位状态下当前这一次定位会返回超时,但按照既定周期的定位请求会继续发起。

1
2
//单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(20000);

设置是否开启定位缓存机制

缓存机制默认开启,可以通过以下接口进行关闭。

当开启定位缓存功能,在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。

1
2
//关闭缓存机制
mLocationOption.setLocationCacheEnable(false);

启动定位

1
2
3
4
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();


获取定位结果

AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。

实现监听器

1
2
3
4
5
6
7
8
//可以通过类implement方式实现AMapLocationListener接口,也可以通过创造接口类对象的方法实现
//以下为后者的举例:
AMapLocationListener mAMapLocationListener = newAMapLocationListener(){
@Override
publicvoid  onLocationChanged(AMapLocation amapLocation) {
     
  }
}

之后在监听器的回调方法内解析AMapLocation对象。

解析AMapLocation对象

首先,可以判断AMapLocation对象不为空,当定位错误码类型为0时定位成功。

1
2
3
4
5
6
7
8
9
10
if(amapLocation != null) {
    if(amapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
    }else{
    //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
    Log.e("AmapError","location Error, ErrCode:"
        + amapLocation.getErrorCode() + ", errInfo:"
        + amapLocation.getErrorInfo());
    }
}

当定位成功时,可在如上判断中解析amapLocation对象的具体字段,参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
amapLocation.getFloor();//获取当前室内定位的楼层
amapLocation.getGpsStatus();//获取GPS的当前状态
//获取定位时间
SimpleDateFormat df = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = newDate(amapLocation.getTime());
df.format(date);

最后一步,停止定位

停止定位

1
mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁

销毁定位客户端

销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。

1
mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。

获取的结果如下: