安卓高德地图定位篇-(1)
来源:互联网 发布:mac os ie内核浏览器 编辑:程序博客网 时间:2024/06/04 19:46
先看效果图:
STEP1:
先去高德开放平台注册账号,这个不用多说吧
网址:http://lbs.amap.com/
之后再去控制台-应用管理找到自己的key,如下图所示
STEP2:
回到AS 这里也可以去下载架包导入 我直接引入的
网址:http://lbs.amap.com/api/android-sdk/download
在module-build.gradle里引入即可,在点击右上角Sync Now即可
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') //定位 compile 'com.amap.api:location:latest.integration' //地图 compile 'com.amap.api:3dmap:latest.integration'}
STEP3:布局文件 activity_map_location
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res- auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.helloworld.gather.activity.MapLocationActivity"> <!--引用的一个头,布局可以删除--> <include layout="@layout/activity_app_title"/> <!--代码提示不出来,最好复制--> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="@dimen/dip_0" android:layout_weight="1"/> <!--显示当前位置信息--> <TextView android:id="@+id/tv_location" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:drawableLeft="@drawable/icon_location" android:drawablePadding="@dimen/dip_10" android:gravity="center_vertical" android:padding="@dimen/dip_10" android:text="@string/loading" android:textColor="@color/colorPrimary" android:textSize="@dimen/sp_15"/></LinearLayout>
STEP4:权限类
import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;public class LocationUtils { /** * 初始化定位 */ public static AMapLocationClient initLocation(Context context, AMapLocationClientOption locationOption, AMapLocationListener locationListener) { //初始化client AMapLocationClient locationClient = new AMapLocationClient(context.getApplicationContext()); //设置定位参数 locationClient.setLocationOption(locationOption); // 设置定位监听 locationClient.setLocationListener(locationListener); return locationClient; } /** * 定位参数 */ public static AMapLocationClientOption getDefaultOption() { AMapLocationClientOption mOption = new AMapLocationClientOption(); //可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式 mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //可选,设置是否gps优先,只在高精度模式下有效。默认关闭 mOption.setGpsFirst(false); //可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效 mOption.setHttpTimeOut(25000); //可选,设置定位间隔。默认为2秒 mOption.setInterval(2000); //可选,设置是否返回逆地理地址信息。默认是true mOption.setNeedAddress(true); //可选,设置是否单次定位。默认是false mOption.setOnceLocation(false); //可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用 mOption.setOnceLocationLatest(false); //可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP); //可选,设置是否使用传感器。默认是false mOption.setSensorEnable(false); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差 mOption.setWifiScan(true); //可选,设置是否使用缓存定位,默认为true mOption.setLocationCacheEnable(true); return mOption; }}
STEP 5:清单文件 AndroidManifest.xml 权限贴不出来不知道为什么
<!-- 高德地图 --> <meta-data android:name="com.amap.api.v2.apikey" android:value="eb415daf7a068ed6483c4fc064c9d97c"/> <service android:name="com.amap.api.location.APSService"/>
STEP:6 MainActivity 返回信息:
http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation
import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import com.amap.api.maps.AMap;import com.amap.api.maps.MapView;import com.amap.api.maps.model.MyLocationStyle;import com.helloworld.gather.R;import com.helloworld.gather.util.LocationUtils;import com.helloworld.gather.util.Tools;import com.helloworld.gather.widget.PermissionsUtils;public class MapLocationActivity extends AppCompatActivity implements View.OnClickListener, AMapLocationListener { private static final int PERMISSON_REQUESTCODE = 0; private TextView tv_location; private MapView mMapView; private AMap aMap; //判断权限是否打开 private boolean isNeedCheck = true; private MyLocationStyle myLocationStyle; private static final String TAG = "MapLocationActivity"; //声明AMapLocationClient类对象 public AMapLocationClient mLocationClient = null; //声明AMapLocationClientOption对象 public AMapLocationClientOption mLocationOption = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map_location); findViewById(R.id.ic_back).setOnClickListener(this); mMapView = (MapView) this.findViewById(R.id.map); tv_location = (TextView) this.findViewById(R.id.tv_location); // 此方法须重写,虚拟机需要在很多情况下保存地图绘制的当前状态 mMapView.onCreate(savedInstanceState); initLocation(); //自己选择是否添加 //判断当前设备版本号是否为4.4以上,如果是,则通过调用setTranslucentStatus让状态栏变透明 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setTranslucentStatus(true); } }/** * 设置状态栏透明 * * @param on */ @TargetApi(19) private void setTranslucentStatus(boolean on) { Window win = getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; if (on) { winParams.flags |= bits; } else { winParams.flags &= ~bits; } win.setAttributes(winParams); } private void initLocation() { if (aMap == null) { aMap = mMapView.getMap(); } /TODO 缩放级别3-19,不支持自定义 要监听否则无效 aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { @Override public void onMapLoaded() { aMap.moveCamera(CameraUpdateFactory.zoomTo(16)); } }); //指南针 aMap.getUiSettings().setCompassEnabled(true); //显示默认的定位按钮 aMap.getUiSettings().setMyLocationButtonEnabled(true); //显示实时交通状况(默认地图) //aMap.setTrafficEnabled(true); //地图模式-标准地图:MAP_TYPE_NORMAL、卫星地图:MAP_TYPE_SATELLITE aMap.setMapType(AMap.MAP_TYPE_NORMAL); initLocationStyle(); //动态设置权限 if (isNeedCheck) { if (PermissionsUtils.checkPermissions(this, PERMISSON_REQUESTCODE, PermissionsUtils.locationPermissions)) { initaion(); } } else { initaion(); } } private void initaion() { //基本的定位参数 mLocationOption = LocationUtils.getDefaultOption(); mLocationClient = LocationUtils.initLocation(this, mLocationOption, this); //启动定位 mLocationClient.startLocation(); } private void initLocationStyle() { //实现定位蓝点 //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位) //如果不设置myLocationType,默认也会执行此种模式。 myLocationStyle = new MyLocationStyle(); //设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。 aMap.setMyLocationEnabled(true); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。 //单位:毫秒,默认值:1000毫秒,如果传小于1000的任何值将按照1000计算。 //myLocationStyle.interval(2000); //只定位一次。 //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW); //定位一次,且将视角移动到地图中心点。 myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE); //连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位) //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW) ; //连续定位、且将视角移动到地图中心点,地图依照设备方向旋转,定位点会跟随设备移动。(1秒1次定位) //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE); //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。 //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); //以下三种模式从5.1.0版本开始提供 //连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。 //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER); //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER); //连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。 //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER); //设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。 //myLocationStyle.myLocationIcon(R.mipmap.ic_launcher); //设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。 //myLocationStyle.showMyLocation(true); //设置定位蓝点精度圆圈的边框颜色的方法。[会叠加不建议设置] //myLocationStyle.strokeColor(R.color.colorAccent); //设置定位蓝点精度圆圈的填充颜色的方法。 //myLocationStyle.radiusFillColor(R.color.colorAccent); //设置定位蓝点精度圈的边框宽度的方法。 //myLocationStyle.strokeWidth(20f); aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ic_back: this.finish(); break; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSON_REQUESTCODE) { if (!PermissionsUtils.verifyPermissions(grantResults)) { //没打开权限 跳转至设置界面 Tools.startAppSettings(this); isNeedCheck = false; } else { initLocation(); } } } @Override public void onDestroy() { super.onDestroy(); //销毁地图 if (mMapView != null) { mMapView.onDestroy(); } } @Override public void onResume() { super.onResume(); //重新绘制加载地图 if (mMapView != null) { mMapView.onResume(); } } @Override public void onPause() { super.onPause(); //暂停地图的绘制 if (mMapView != null) { mMapView.onPause(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mMapView != null) { mMapView.onSaveInstanceState(outState); } } private String cityName, AdCode, cityCode, province, poiName, street, district; private double latitude, longitude; @Override public void onLocationChanged(AMapLocation amapLocation) { if (amapLocation.getErrorCode() == 0) { //更多返回看(文档:http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation) latitude = amapLocation.getLatitude();//获取纬度 longitude = amapLocation.getLongitude();//获取经度 province = amapLocation.getProvince();//省信息 cityName = amapLocation.getCity();//城市信息 district = amapLocation.getDistrict();//城区信息 street = amapLocation.getStreet();//街道信息 cityCode = amapLocation.getCityCode();//城市编码 AdCode = amapLocation.getAdCode();//地区编码 poiName = amapLocation.getPoiName();//获取当前位置的POI名称 Log.e(TAG, "onLocationChanged: " + cityName); Log.e(TAG, "onLocationChanged: " + AdCode); Log.e(TAG, "onLocationChanged: " + cityCode); Log.e(TAG, "onLocationChanged: " + province); Log.e(TAG, "onLocationChanged: " + poiName); Log.e(TAG, "onLocationChanged: " + latitude); Log.e(TAG, "onLocationChanged: " + street); Log.e(TAG, "onLocationChanged: " + longitude); Log.e(TAG, "onLocationChanged: " + district); Log.e(TAG, "onLocationChanged: " + amapLocation.getAddress()); Log.e(TAG, "onLocationChanged: " + amapLocation.getStreetNum()); Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationType()); Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationDetail()); //显示当前的位置 tv_location.setText(amapLocation.getAddress()); //停止定位后,本地定位服务并不会被销毁 mLocationClient.stopLocation(); //销毁定位客户端,同时销毁本地定位服务。 mLocationClient.onDestroy(); } else { //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 Log.e(TAG, "定位失败, 错误码:" + amapLocation.getErrorCode() + "\n" + " 错误信息:" + amapLocation.getErrorInfo() + "\n" + "APK SHA1值为:" + Tools.getSHA1(this)); String str = amapLocation.getErrorInfo(); String[] split = str.split(" "); //截取第一个空格之前的错误日志 Toast.makeText(this,split[0],Toast.LENGTH_SHORT).show(); //停止定位后,本地定位服务并不会被销毁 mLocationClient.stopLocation(); //销毁定位客户端,同时销毁本地定位服务。 mLocationClient.onDestroy(); } }}
STEP:7 SHA1码的获取
获取APK当前签名文件的SHA1:
/** * 获取APK当前签名文件的SHA1 */ public static String getSHA1(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; } /** * 跳转至设置界面方法 */ public static void startAppSettings(Context context) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); context.startActivity(intent); }
STEP:8 一般到这里就结束了,如果定位失败可以到这个网址链接查看错误码说明:http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/
最后注意APP SHA1不要填错 否则会定位到 非洲去…
阅读全文
2 0
- 安卓高德地图定位篇-(1)
- 安卓高德地图定位
- 百度地图:加强篇(定位)
- 地图定位(gps)
- 安卓高德地图定位和普通地图
- mapabc地图开发之定位篇(GPS+谷歌基站定位+高德基站定位)
- mapabc地图开发之定位篇(GPS+谷歌基站定位+高德基站定位)
- 百度地图 (定位、回到定位点)
- 地图与定位(一)定位服务
- 地图与定位(二)系统地图
- 百度地图之定位篇
- swift 地图定位(一)
- swift 地图定位(三)
- swift 地图定位(四)
- 安卓高德地图开发(2)——定位
- Android 不归路之百度地图API学习(定位篇)
- 地图与定位(LBS)-MapKit篇
- 地图定位
- hrbust 1401 九连环(矩阵快速幂)
- c++ Premier 学习笔记(unit2 变量和基本类型 -声明与定义
- ios单例模式的实现
- 解决weex点击事件触发两次
- hibernate_多对多关联关系配置
- 安卓高德地图定位篇-(1)
- Mockito与Spring中@Autowired与@InjectMocks组合
- 有向图—朱刘算法模板
- 牛客网《剑指Offer》 矩形覆盖
- NYOJ 90 整数划分
- Regularization
- C++ Primer学习笔记(unit 2 变量和基本类型 -标识符
- 七个习惯
- 无用的探索