首先註冊高德成爲開發者(打開高德地圖,點擊底部的開發者平臺),建立應用,按照要求填寫相應信息java
網站:http://lbs.amap.com/api/android-sdk/guide/create-project/get-key android
途中包含了發佈版的SHA1安全碼和測試版SHA1安全碼,二者的值能夠看 git
照作就必定會獲取的。api
這裏我講發佈版和調試版都用的relase版本的sha1緩存
以後再去下載相應的Jar包,這裏我用的是安全
3D地圖的jar包網絡
注意:2D地圖的jar包,與3D地圖的jar包由於接口有同樣的,致使衝突沒法使用。app
在jnilibs下放入一下文件ide
由於有些人的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] + "\n" + "經 度:" + strMsg[1] + "\n" + "緯 度:" + strMsg[2]+"\n"); 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("\n", "<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("定位成功" + "\n"); sb.append("定位類型: " + location.getLocationType() + "\n"); sb.append("經 度 : " + location.getLongitude() + "\n"); sb.append("緯 度 : " + location.getLatitude() + "\n"); sb.append("精 度 : " + location.getAccuracy() + "米" + "\n"); sb.append("提供者 : " + location.getProvider() + "\n"); if (location.getProvider().equalsIgnoreCase( android.location.LocationManager.GPS_PROVIDER)) { // 如下信息只有提供者是GPS時纔會有 sb.append("速 度 : " + location.getSpeed() + "米/秒" + "\n"); sb.append("角 度 : " + location.getBearing() + "\n"); // 獲取當前提供定位服務的衛星個數 sb.append("星 數 : " + location.getSatellites() + "\n"); } else { // 提供者是GPS時是沒有如下信息的 sb.append("國 家 : " + location.getCountry() + "\n"); sb.append("省 : " + location.getProvince() + "\n"); sb.append("市 : " + location.getCity() + "\n"); sb.append("城市編碼 : " + location.getCityCode() + "\n"); sb.append("區 : " + location.getDistrict() + "\n"); sb.append("區域 碼 : " + location.getAdCode() + "\n"); sb.append("地 址 : " + location.getAddress() + "\n"); sb.append("興趣點 : " + location.getPoiName() + "\n"); return (location.getAddress() + "," + location.getLongitude() + "," + location.getLatitude()); } //這個方法能夠進行反向的地理圍欄圈定 //if(location.getLatitude()==「緯度」||location.getLongitude()==「經度」){ // sb.append("能夠簽到"+"\n"); // return sb.toString(); // } // else { // sb.append("不可簽到"+"\n"); // } // } else { //定位失敗 sb.append("定位失敗" + "\n"); sb.append("錯誤碼:" + location.getErrorCode() + "\n"); sb.append("錯誤信息:" + location.getErrorInfo() + "\n"); sb.append("錯誤描述:" + location.getLocationDetail() + "\n"); return sb.toString(); } return sb.toString(); } }
若是要使用那個逆地理的編碼圍欄,你須要本身設定button控件的響應事件,經過返回值來控制button是否開啓