高德地图三:定位
什么是定位SDK
Android 定位 SDK 是一套简单的LBS服务定位接口,您可以使用这套定位API获取定位结果、逆地理编码(地址文字描述)、以及地理围栏功能。
代码实现:
app/src/main/AndroidManifest.xml
<!--地图包、搜索包需要的基础权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<permission android:name="android.permission.WRITE_APN_SETTINGS" />
<!--定位包、导航包需要的额外权限(注:基础权限也需要)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.CompoundButton;
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.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.MyLocationStyle;
import com.example.administrator.Permission.PermissionManager;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends Activity implements CompoundButton.OnCheckedChangeListener
,AMapLocationListener,LocationSource,PermissionManager.PermissionsResultListener {
private MapView mapView;
private AMap aMap;
//定位服务类。此类提供单次定位、持续定位、地理围栏、最后位置相关功能
private AMapLocationClient aMapLocationClient;
private OnLocationChangedListener listener;
//定位参数设置
private AMapLocationClientOption aMapLocationClientOption;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PermissionManager.requestPermission(this,"定位",0,this, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_COARSE_LOCATION);
mapView = (MapView)findViewById(R.id.map);
mapView.onCreate(savedInstanceState); //必须写
aMap = mapView.getMap();
//设置地图类型
aMap.setMapType(AMap.MAP_TYPE_NORMAL);
MyLocationStyle locationStyle = new MyLocationStyle();
locationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.start));
locationStyle.strokeColor(Color.BLUE);
locationStyle.strokeWidth(5);
aMap.setMyLocationStyle(locationStyle);
// 设置定位监听
aMap.setLocationSource(this);
aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
// 设置定位的类型为定位模式,参见类AMap。
aMap.setMapType(AMap.MAP_TYPE_NORMAL);
// 设置为true表示系统定位按钮显示并响应点击,false表示隐藏,默认是false
aMap.setMyLocationEnabled(true);
aMapLocationClient = new AMapLocationClient(getApplicationContext());
aMapLocationClient.setLocationListener(this);
//初始化定位参数
aMapLocationClientOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
aMapLocationClientOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
aMapLocationClientOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
aMapLocationClientOption.setWifiScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
aMapLocationClientOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
aMapLocationClientOption.setInterval(2000);
//给定位客户端对象设置定位参数
aMapLocationClient.setLocationOption(aMapLocationClientOption);
//启动定位
aMapLocationClient.startLocation();
}
/**
* 定位回调监听,当定位完成后调用此方法
* @param aMapLocation
*/
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(listener!=null && aMapLocation!=null) {
listener.onLocationChanged(aMapLocation);// 显示系统小蓝点
if (aMapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
aMapLocation.getLatitude();//获取经度
aMapLocation.getLongitude();//获取纬度;
aMapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date);//定位时间
aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果
aMapLocation.getCountry();//国家信息
aMapLocation.getProvince();//省信息
aMapLocation.getCity();//城市信息
aMapLocation.getDistrict();//城区信息
aMapLocation.getRoad();//街道信息
aMapLocation.getCityCode();//城市编码
aMapLocation.getAdCode();//地区编码
Toast.makeText(this,"定位成功",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this,"定位失败",Toast.LENGTH_SHORT).show();
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.i("Tomato","location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
listener = onLocationChangedListener;
}
@Override
public void deactivate() {
}
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必须重写
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必须重写
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
//销毁定位客户端
if(aMapLocationClient!=null){
aMapLocationClient.onDestroy();
aMapLocationClient = null;
aMapLocationClientOption = null;
}
}
@Override
public void onPermissionGranted(int requestCode) {
}
@Override
public void onPermissionDenied(int requestCode) {
}
}