一、位置服务
1、获取 LocationProvider
获取所有可用的 LocationProvider
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
StringBuilder stringBuilder = new StringBuilder();
List<String> allProviders = locationManager.getAllProviders();
for (String location :
allProviders) {
stringBuilder.append(location+"\n");
}
textView.setText(stringBuilder.toString());
通过名称获取 LocationProvider
LocationProvider provider = locationManager.getProvider(LocationManager.GPS_PROVIDER);
textView.setText(provider.getName());
通过 Criteria 获取 LocationProvider
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
String provider = locationManager.getBestProvider(criteria,true);
textView.setText(provider);
2、获取位置信息
基本实现步骤
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191018161105836.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YW53dWM=,size_16,color_FFFFFF,t_70)
代码示例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.dis_location);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
});
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
updateLocation(location);
}
protected void updateLocation(Location location) {
if (location != null) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("经度:" + location.getLongitude() + "\n");
stringBuilder.append("纬度:" + location.getLatitude() + "\n");
textView.setText(stringBuilder.toString());
} else {
textView.setText("没有获取到位置信息");
}
}
二、地图服务(百度地图)
1、申请密钥(API key)
- 密钥申请的网址:http://lbsyun.baidu.com/apiconsole/key
- 这个网址中点击创建应用会要求输入开发者SHA1,这个值的获取可以直接通过JDK自带的keytool进行获取
keytool -list -v -keystore debug.keystore
,可能会要求输入口令,默认的口令一般是 android - 完成创建应用后就会生成相应的密钥,后面创建app的时候会在配置文件里面输入
2、创建和显示地图
- 还是上面的网址可以根据自己需要的功能生成和下载相应的 SDK
- AS 中百度地图 SDK 的配置其实主要就是jar文件的添加和 so 库文件的加入,so文件带文件夹一致复制到main 文件夹中的JNIlibs 文件夹中(需要自己创建)
- 最后就是基本的使用了:manifest 文件中配置权限和密钥----布局文件中添加map的容器----设置布局文件之前初始化SDK----将map的生命周期和activity 的生命周期关联
3、定位到我的位置
示例代码
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private LocationClient mLocationClient;
private static boolean isFirstLoc = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mLocationClient = new LocationClient(this);
initLocation();
}
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(new MyLocationListener());
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.setMapStatus(mapStatus);
}
}
}
@Override
protected void onStart() {
super.onStart();
mBaiduMap.setMyLocationEnabled(true);
mLocationClient.start();
}
@Override
protected void onStop() {
super.onStop();
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
}
代码说明
- 首先 manifest application里面要开启定位的服务
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
- java代码里面最核心的对象就是 LocationClient 对象,通过这个对象可以发起定位,通过注册locationlistener可以在接受到定位数据的时候进行处理
- MyLocationData 对象用来构造位置数据,首次定位需要初始化位置
- Activity 的Onstart 和 Onstop 方法里面分别开启(关闭)定位图层和启动(关闭)locationClient