首先注冊高德成為開發者(打開高德地圖,點擊底部的開發者平台),創建應用,按照要求填寫相應信息
網站: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] + "\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是否開啟
