GPS基础

时间:2021-08-31 17:09:17

public class MainActivity extends Activity {
private LocationManager manager;
private List<String> providers;// 可以用GPS还是网络来定位
private Location location;// 我们所在的位置
private String provider;// 用哪种方式定位
private LocationListener listener;// 位置改变的监听

private BaiduMap baiduMap;// 百度地图控制器
private MapView mapview;// 地图容器

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 初始化地图
SDKInitializer.initialize(getApplicationContext());// 初始化<meta-data>

setContentView(R.layout.map_main);

mapview = (MapView) findViewById(R.id.mapview);
baiduMap = mapview.getMap();
baiduMap.setMyLocationEnabled(true);// 显示地图上的那个点

// 位置服务
manager = (LocationManager) getSystemService(LOCATION_SERVICE);

providers = manager.getProviders(true);// 得到此设备上可用的定位(GPS.NETWORK)

if (providers.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {// 网络和GPS没有打开
Toast.makeText(this, "找不到可用的网络或者GPS", Toast.LENGTH_SHORT).show();
}

// location = manager.getLastKnownLocation(provider);// 上面找到的可用的定位方式
location = manager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
showLocation(location);
}

listener = new MyLocationListener();
// 位置在改变的时候,信息也得跟着改变,注册
manager.requestLocationUpdates(provider, 2000, 3, listener);// 哪个定位方式,多长时间定位一次,最少移动多远(米),具体定位的代码

// Log.i("经度:", ""+location.getLatitude());
// Log.i("纬度:", ""+location.getLongitude());

// for(String p: provider){
// //LocationManager.GPS_PROVIDER
// //LocationManager.NETWORK_PROVIDER
//
// Log.i("哪些可用的方式定位", p);
// }
}

// 定位监听
class MyLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location location) {// 当位置改变了调用
showLocation(location);
}

@Override
public void onProviderDisabled(String provider) {// 定位功能关闭了

}

@Override
public void onProviderEnabled(String provider) {// 定位功能能用了

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {// 定位方式改变了

}

}

public void showLocation(Location location) {// 写一个定位的方法,找到上面设置好的位置信息
// Log.i("经度:", "" + location.getLatitude());
// Log.i("纬度:", "" + location.getLongitude());
double latitude = location.getLatitude();
double longitude = location.getLatitude();

// 将定位的经度纬度给百度API的LATLNG类
LatLng ll = new LatLng(latitude, longitude);
// 定位地图的改变
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(17f);// 3-19,数字越大,距离最小
baiduMap.animateMapStatus(update);

// AlertDialog.Builder builder = new
// AlertDialog.Builder(this).setTitle("ddd").setMessage("ddd");
// builder.create();
MyLocationData.Builder builder = new MyLocationData.Builder().latitude(
latitude).longitude(longitude);// 构造一个MyLocationData.Builder对象

// 构造 MyLocationData对象
MyLocationData data = builder.build();

// 把我的位置标注在地图上
baiduMap.setMyLocationData(data);
}

// 暂停的时候
@Override
protected void onPause() {
super.onPause();
mapview.onPause();
}

// 持续运行的时候
@Override
protected void onResume() {
super.onResume();
mapview.onResume();
}

// 退出的时候
@Override
protected void onDestroy() {
super.onDestroy();
baiduMap.setMyLocationEnabled(false);
mapview.onDestroy();
if (manager != null) {
manager.removeUpdates(listener);
}
}
}