一、集成高德定位需要如下步骤:
1、登录高德地图开放平台 登录进入控制台创建新的应用,给应用添加key;
2、下载高德定位SDK,并在Android studio 中进行相关配置;
3、XML布局及activity代码逻辑整理;
4、*展示下高德定位相关的错误码,方便核实查找;
二、集成详解:
1、登录高德地图开放平台 登录进入控制台创建新的应用,给应用添加key;
①、登录高德开放平台,地址:http://lbs.amap.com/
②、进入控制台创建新的应用(根据自己需求创建应用信息):
③、创建应用后给对应应用添加key:填写key名(随意,符合命名规则即可)、选择自己对应需求的服务平台、填写SHA1(获取SHA1在下面④中详解 以studio为例)和包名(集成在自己对应的项目中的包名):
④、如何获取自己项目对应的SHA1呢?详见下面步骤:
a、首相在Android studio中创建对应的项目;
b、创建对应项目的keystore,步骤:Android studio工具栏点击Build——>Generate Signed APK——>选择对应的Module——>Next——>Create new 见图解
c、通过Android studio自带工具Terminal 获取SHA1:
步骤:点击Terminal工具,在控制台输入keytool -list -v -keystore 创建的keystore文件路径,然后回车 ——>输入自己设置的密码口令 ——>回车,即可得到对应的SHA1 见图解
⑤、将SHA1 复制到高德后台自己创建的应用中,然后复制自己的项目包名,填好后确认即可得到对应的key
2、下载高德定位SDK,并在Android studio 中进行相关配置;
定位SDK下载地址:http://lbs.amap.com/api/android-location-sdk/download
Android studio配置信息:
①、将下载好的jar文件放到工程libs文件夹下,并add到工程中
②、AndroidManifest.xml 配置
首先进行权限配置,如下:
android:name="android.permission.ACCESS_COARSE_LOCATION"> android:name="android.permission.ACCESS_FINE_LOCATION"> android:name="android.permission.ACCESS_NETWORK_STATE"> android:name="android.permission.ACCESS_WIFI_STATE"> android:name="android.permission.CHANGE_WIFI_STATE"> android:name="android.permission.INTERNET"> android:name="android.permission.READ_PHONE_STATE"> android:name="android.permission.WRITE_EXTERNAL_STORAGE"> android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"> android:name="android.permission.BLUETOOTH"> android:name="android.permission.BLUETOOTH_ADMIN">
其次设置key,在application中,并申明service组件 ,如下:
android:name="com.amap.api.v2.apikey" android:value="自己在高德申请的key" /> android:name="com.amap.api.location.APSService" />
3、XML布局及activity代码整理
①、布局(按照你自己的想法布局),以下是示例:
android:textColor="#fff"
android:id="@+id/tv_location"
android:layout_width="0dp"
android:layout_weight="6"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="定位地址"
/>
②activity中代码整理:(代码中加入了动态申请定位权限的功能,定位权限是一个危险的权限,需要得到用户的同意)
public class MainActivity extends AppCompatActivity { //声明AMapLocationClient类对象 public AMapLocationClient mLocationClient = null; private String address;//地址信息 //声明AMapLocationClientOption对象 public AMapLocationClientOption mLocationOption = null; private int LOCATION = 2;//定位 private String mCity; private String mDistrict; private String mStreet; private String mStreetNum; private TextView mLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //显示定位信息 mLocation = (TextView) findViewById(R.id.tv_location); Button location_bt = (Button) findViewById(R.id.bt_location);//按钮,点击进行定位 //获取SHA1 String s = sHA1(this).toString(); Log.i("SHA1","" + s); location_bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)){ Toast.makeText(MainActivity.this,"打开位置权限",0).show(); } //请求权限 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION); }else { //已经打开定位权限就直接开启定位 init(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case 2: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //打开定位权限ok Toast.makeText(MainActivity.this,"打开定位权限ok",0).show(); init(); }else { //打开定位权限失败 Toast.makeText(MainActivity.this,"打开定位权限失败",0).show(); } break; } } private void init() { //初始化定位 mLocationClient = new AMapLocationClient(MainActivity.this); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener); //初始化mLocationOption对象 mLocationOption = new AMapLocationClientOption(); //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置是否返回地址信息(默认返回地址信息) mLocationOption.setNeedAddress(true); //设置是否只定位一次,默认为false mLocationOption.setOnceLocation(false); //设置是否强制刷新WIFI,默认为强制刷新 mLocationOption.setWifiActiveScan(true); //设置是否允许模拟位置,默认为false,不允许模拟位置 mLocationOption.setMockEnable(false); //设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(2000); //给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption); //单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。 mLocationOption.setHttpTimeOut(20000); //关闭缓存机制 mLocationOption.setLocationCacheEnable(false); //启动定位 mLocationClient.startLocation(); } @Override protected void onStop() { super.onStop(); mLocationClient.stopLocation();//停止定位 } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.onDestroy();//销毁定位 } //声明定位回调监听器 //可以通过类implement方式实现AMapLocationListener接口,也可以通过创造接口类对象的方法实现 public AMapLocationListener mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation amapLocation) { if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { //可在其中解析amapLocation获取相应内容。 amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表 amapLocation.getLatitude();//获取纬度 amapLocation.getLongitude();//获取经度 amapLocation.getAccuracy();//获取精度信息 amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。 amapLocation.getCountry();//国家信息 amapLocation.getProvince();//省信息 //城市信息 mCity = amapLocation.getCity(); //城区信息 mDistrict = amapLocation.getDistrict(); //街道信息 mStreet = amapLocation.getStreet(); //街道门牌号信息 mStreetNum = amapLocation.getStreetNum(); amapLocation.getCityCode();//城市编码 amapLocation.getAdCode();//地区编码 amapLocation.getAoiName();//获取当前定位点的AOI信息 amapLocation.getBuildingId();//获取当前室内定位的建筑物Id amapLocation.getFloor();//获取当前室内定位的楼层 // amapLocation.getGpsStatus();//获取GPS的当前状态 //获取定位时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(amapLocation.getTime()); df.format(date); address = amapLocation.getAddress(); Log.i("city","" + mCity); mLocation.setText(mCity+mDistrict+mStreet+mStreetNum); } else { //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 Log.e("AmapError", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } }; }
下面给出一个自动获取SHA1的代码:
//代码获取SHA1 public static String sHA1(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES); byte[] cert = info.signatures[0].toByteArray(); MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] publicKey = md.digest(cert); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < publicKey.length; i++) { String appendString = Integer.toHexString(0xFF & publicKey[i]) .toUpperCase(Locale.US); if (appendString.length() == 1) hexString.append("0"); hexString.append(appendString); hexString.append(":"); } String result = hexString.toString(); return result.substring(0, result.length()-1); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
4、高德定位相关错误码:地址:http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode
响应码 |
问题说明 |
问题排查策略 |
---|---|---|
0 |
定位成功。 |
可以在定位回调里判断定位返回成功后再进行业务逻辑运算。 |
1 |
一些重要参数为空,如context; |
请对定位传递的参数进行非空判断。 |
2 |
定位失败,由于仅扫描到单个wifi,且没有基站信息。 |
请重新尝试。 |
3 |
获取到的请求参数为空,可能获取过程中出现异常。 |
请对所连接网络进行全面检查,请求可能被篡改。 |
4 |
请求服务器过程中的异常,多为网络情况差,链路不通导致 |
请检查设备网络是否通畅,检查通过接口设置的网络访问超时时间,建议采用默认的30秒。 |
5 |
请求被恶意劫持,定位结果解析失败。 |
您可以稍后再试,或检查网络链路是否存在异常。 |
6 |
定位服务返回定位失败。 |
请获取errorDetail(通过getLocationDetail()方法获取)信息并参考定位常见问题进行解决。 |
7 |
KEY鉴权失败。 |
请仔细检查key绑定的sha1值与apk签名sha1值是否对应,或通过高频问题查找相关解决办法。 |
8 |
Android exception常规错误 |
请将errordetail(通过getLocationDetail()方法获取)信息通过工单系统反馈给我们。 |
9 |
定位初始化时出现异常。 |
请重新启动定位。 |
10 |
定位客户端启动失败。 |
请检查AndroidManifest.xml文件是否配置了APSService定位服务 |
11 |
定位时的基站信息错误。 |
请检查是否安装SIM卡,设备很有可能连入了伪基站网络。 |
12 |
缺少定位权限。 |
请在设备的设置中开启app的定位权限。 |
13 |
定位失败,由于未获得WIFI列表和基站信息,且GPS当前不可用。 |
建议开启设备的WIFI模块,并将设备中插入一张可以正常工作的SIM卡,或者检查GPS是否开启;如果以上都内容都确认无误,请您检查App是否被授予定位权限。 |
14 |
GPS 定位失败,由于设备当前 GPS 状态差。 |
建议持设备到相对开阔的露天场所再次尝试。 |
15 |
定位结果被模拟导致定位失败 |
如果您希望位置被模拟,请通过 |
16 |
当前POI检索条件、行政区划检索条件下,无可用地理围栏 |
建议调整检索条件后重新尝试,例如调整POI关键字,调整POI类型,调整周边搜区域,调整行政区关键字等。 |
18 |
定位失败,由于手机WIFI功能被关闭同时设置为飞行模式 |
建议手机关闭飞行模式,并打开WIFI开关 |
19 |
定位失败,由于手机没插sim卡且WIFI功能被关闭 |
建议手机插上sim卡,打开WIFI开关 |
以上,初来乍到,还请包含!