首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息
网站:http://lbs.amap.com/api/android-sdk/guide/create-project/get-key
途中包含了发布版的SHA1安全码和测试版SHA1安全码,两者的值可以看
照做就一定会获取的。
这里我讲发布版和调试版都用的relase版本的sha1
之后再去下载相应的Jar包,这里我用的是
3D地图的jar包
注意:2D地图的jar包,与3D地图的jar包因为接口有一样的,导致冲突无法使用。
在jnilibs下放入一下文件
因为有些人的android studio无法显示,但又不报错(我就这样)。你就需要将以上红圈类容放入libs,才能显示
之后在
将导入的jar包添加到类包;
选择,找到于自己名字一样的Jar,添加就可以了。之后检查在build.gradle 是否添加了以下类容
compile files('libs/AMap3DMap_5.1.0_AMapSearch_5.1.0_AMapLocation_3.4.0_20170518.jar') compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12'
并且设置jar包的位置为libs
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' })
在androidManifest.xml中添加自己的添加权限
<!-- 用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 用于访问网络,网络定位需要上网 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于写入缓存数据到扩展存储卡 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于申请调用A-GPS模块 --> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于申请获取蓝牙信息进行室内定位 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
添加自己的key
<meta-data android:name="com.amap.api.v2.apikey" android:value="你的key" />
添加定位方法
<service android:name="com.amap.api.location.APSService" />
在Activity_main.xml中添加
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/text1"/> <com.amap.api.maps.MapView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/map"> </com.amap.api.maps.MapView>
在MainActivty的主代码
public class MainActivity extends AppCompatActivity implements AMapLocationListener,GeocodeSearch.OnGeocodeSearchListener { private Button button; private AMapLocationClient locationClient = null; private AMapLocationClientOption locationOption = null; private TextView textView; private String[] strMsg; private com.amap.api.maps.AMap aMap; private MapView mapView; private GeocodeSearch geocoderSearch; private Marker geoMarker; private static LatLonPoint latLonPoint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.text1); textView = (TextView)findViewById(R.id.textView2); button=(Button)findViewById(R.id.button); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 Location(); final Intent intent=new Intent(); intent.setAction("Utils"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle data =new Bundle(); data.putString("msg","签到成功"); intent.putExtra("data",data); sendBroadcast(intent); } }); } private void initMap(){ if (aMap == null) { aMap = mapView.getMap(); //用高德默认图标 geoMarker= aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))); //自定义图标 //geoMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f) // .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.punch_dw)))); } geocoderSearch = new GeocodeSearch(this); geocoderSearch.setOnGeocodeSearchListener(this); getAddress(latLonPoint); } @Override public void onLocationChanged(AMapLocation loc) { if (null != loc) { Message msg = mHandler.obtainMessage(); msg.obj = loc; msg.what = Utils.MSG_LOCATION_FINISH; mHandler.sendMessage(msg); } } Handler mHandler = new Handler() { public void dispatchMessage(android.os.Message msg) { switch (msg.what) { //定位完成 case Utils.MSG_LOCATION_FINISH: String result = ""; try { AMapLocation loc = (AMapLocation) msg.obj; result = Utils.getLocationStr(loc, 1); strMsg = result.split(","); Toast.makeText(MainActivity.this, "定位成功", Toast.LENGTH_LONG).show(); textView.setText("地址:" + strMsg[0] + " " + "经 度:" + strMsg[1] + " " + "纬 度:" + strMsg[2]+" "); latLonPoint= new LatLonPoint(Double.valueOf(strMsg[2]), Double.valueOf(strMsg[1])); initMap(); } catch (Exception e) { Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show(); } break; default: break; } }; }; public void Location() { // TODO Auto-generated method stub try { locationClient = new AMapLocationClient(this); locationOption = new AMapLocationClientOption(); // 设置定位模式为低功耗模式 locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); // 设置定位监听 locationClient.setLocationListener(this); locationOption.setOnceLocation(true);//设置为单次定位 locationClient.setLocationOption(locationOption);// 设置定位参数 // 启动定位 locationClient.startLocation(); mHandler.sendEmptyMessage(Utils.MSG_LOCATION_START); } catch (Exception e) { Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show(); } } /** * 响应逆地理编码围栏 */ public void getAddress(final LatLonPoint latLonPoint) { RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 100, GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是网络 坐标系还是GPS原生坐标系 geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求 } /** * 地理编码查询回调 */ @Override public void onGeocodeSearched(GeocodeResult result, int rCode) { } /** * 逆地理编码回调 */ @Override public void onRegeocodeSearched(RegeocodeResult result, int rCode) { if (rCode == 1000) { if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) { Toast.makeText(MainActivity.this,result.getRegeocodeAddress().getFormatAddress() + "附近",Toast.LENGTH_LONG).show(); aMap.animateCamera(CameraUpdateFactory.newLatLngZoom( AMapUtil.convertToLatLng(latLonPoint), 15)); geoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint)); } else { } } else { } } @Override public void onResume() { super.onResume(); mapView.onResume(); } /** * 方法必须重写 */ @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } @Override public void onDestroy() { super.onDestroy(); mapView.onDestroy(); } }
在同级的文件下建立自己的类方法,调用到主代码中
AMapUtil代码为:
public class AMapUtil { /** * 判断edittext是否null */ public static String checkEditText(EditText editText) { if (editText != null && editText.getText() != null && !(editText.getText().toString().trim().equals(""))) { return editText.getText().toString().trim(); } else { return ""; } } public static Spanned stringToSpan(String src) { return src == null ? null : Html.fromHtml(src.replace(" ", "<br />")); } public static String colorFont(String src, String color) { StringBuffer strBuf = new StringBuffer(); strBuf.append("<font color=").append(color).append(">").append(src) .append("</font>"); return strBuf.toString(); } public static String makeHtmlNewLine() { return "<br />"; } public static String makeHtmlSpace(int number) { final String space = " "; StringBuilder result = new StringBuilder(); for (int i = 0; i < number; i++) { result.append(space); } return result.toString(); } public static String getFriendlyLength(int lenMeter) { if (lenMeter > 10000) // 10 km { int dis = lenMeter / 1000; return dis + ""; } if (lenMeter > 1000) { float dis = (float) lenMeter / 1000; DecimalFormat fnum = new DecimalFormat("##0.0"); String dstr = fnum.format(dis); return dstr; } if (lenMeter > 100) { int dis = lenMeter / 50 * 50; return dis + ""; } int dis = lenMeter / 10 * 10; if (dis == 0) { dis = 10; } return dis + ""; } public static boolean IsEmptyOrNullString(String s) { return (s == null) || (s.trim().length() == 0); } /** * 把LatLng对象转化为LatLonPoint对象 */ public static LatLonPoint convertToLatLonPoint(LatLng latlon) { return new LatLonPoint(latlon.latitude, latlon.longitude); } /** * 把LatLonPoint对象转化为LatLon对象 */ public static LatLng convertToLatLng(LatLonPoint latLonPoint) { return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude()); } /** * 把集合体的LatLonPoint转化为集合体的LatLng */ public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shapes) { ArrayList<LatLng> lineShapes = new ArrayList<LatLng>(); for (LatLonPoint point : shapes) { LatLng latLngTemp = AMapUtil.convertToLatLng(point); lineShapes.add(latLngTemp); } return lineShapes; } /** * long类型时间格式化 */ public static String convertToTime(long time) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(time); return df.format(date); } public static final String HtmlBlack = "#000000"; public static final String HtmlGray = "#808080"; public static String getFriendlyTime(int second) { if (second > 3600) { int hour = second / 3600; int miniate = (second % 3600) / 60; return hour + "小时" + miniate + "分钟"; } if (second >= 60) { int miniate = second / 60; return miniate + "分钟"; } return second + "秒"; } public static String getBusPathTitle(BusPath busPath) { if (busPath == null) { return String.valueOf(""); } List<BusStep> busSetps = busPath.getSteps(); if (busSetps == null) { return String.valueOf(""); } StringBuffer sb = new StringBuffer(); for (BusStep busStep : busSetps) { if (busStep.getBusLines().size() > 0) { RouteBusLineItem busline = busStep.getBusLines().get(0); if (busline == null) { continue; } String buslineName = getSimpleBusLineName(busline.getBusLineName()); sb.append(buslineName); sb.append(" > "); } if (busStep.getRailway() != null) { RouteRailwayItem railway = busStep.getRailway(); sb.append(railway.getTrip() + "(" + railway.getDeparturestop().getName() + " - " + railway.getArrivalstop().getName() + ")"); sb.append(" > "); } } return sb.substring(0, sb.length() - 3); } public static String getBusPathDes(BusPath busPath) { if (busPath == null) { return String.valueOf(""); } long second = busPath.getDuration(); String time = getFriendlyTime((int) second); float subDistance = busPath.getDistance(); String subDis = getFriendlyLength((int) subDistance); float walkDistance = busPath.getWalkDistance(); String walkDis = getFriendlyLength((int) walkDistance); return String.valueOf(time + " | " + subDis + " | 步行" + walkDis); } public static String getSimpleBusLineName(String busLineName) { if (busLineName == null) { return String.valueOf(""); } return busLineName.replaceAll("\(.*?\)", ""); } }
Utils的主代码为:
public class Utils { /** * 开始定位 */ public final static int MSG_LOCATION_START = 0; /** * 定位完成 */ public final static int MSG_LOCATION_FINISH = 1; /** * 停止定位 */ /** * 根据定位结果返回定位信息的字符串 * * @return */ public synchronized static String getLocationStr(AMapLocation location, final int index) { if (null == location) { return null; } StringBuffer sb = new StringBuffer(); //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 if (location.getErrorCode() == 0) { sb.append("定位成功" + " "); sb.append("定位类型: " + location.getLocationType() + " "); sb.append("经 度 : " + location.getLongitude() + " "); sb.append("纬 度 : " + location.getLatitude() + " "); sb.append("精 度 : " + location.getAccuracy() + "米" + " "); sb.append("提供者 : " + location.getProvider() + " "); if (location.getProvider().equalsIgnoreCase( android.location.LocationManager.GPS_PROVIDER)) { // 以下信息只有提供者是GPS时才会有 sb.append("速 度 : " + location.getSpeed() + "米/秒" + " "); sb.append("角 度 : " + location.getBearing() + " "); // 获取当前提供定位服务的卫星个数 sb.append("星 数 : " + location.getSatellites() + " "); } else { // 提供者是GPS时是没有以下信息的 sb.append("国 家 : " + location.getCountry() + " "); sb.append("省 : " + location.getProvince() + " "); sb.append("市 : " + location.getCity() + " "); sb.append("城市编码 : " + location.getCityCode() + " "); sb.append("区 : " + location.getDistrict() + " "); sb.append("区域 码 : " + location.getAdCode() + " "); sb.append("地 址 : " + location.getAddress() + " "); sb.append("兴趣点 : " + location.getPoiName() + " "); return (location.getAddress() + "," + location.getLongitude() + "," + location.getLatitude()); } //这个方法可以进行反向的地理围栏圈定 //if(location.getLatitude()==“纬度”||location.getLongitude()==“经度”){ // sb.append("可以签到"+" "); // return sb.toString(); // } // else { // sb.append("不可签到"+" "); // } // } else { //定位失败 sb.append("定位失败" + " "); sb.append("错误码:" + location.getErrorCode() + " "); sb.append("错误信息:" + location.getErrorInfo() + " "); sb.append("错误描述:" + location.getLocationDetail() + " "); return sb.toString(); } return sb.toString(); } }
如果要使用那个逆地理的编码围栏,你需要自己设定button控件的响应事件,通过返回值来控制button是否开启