Android 开发(17)位置和地图

一、位置服务

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、获取位置信息

基本实现步骤

在这里插入图片描述

代码示例
@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;  //定义LocationClient
    private static boolean isFirstLoc = true;  //定义第一次启动

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());   //初始化地图SDK
        setContentView(R.layout.activity_main);
        mMapView = (MapView) findViewById(R.id.bmapView);  //获取地图组件
        mBaiduMap = mMapView.getMap();  //获取百度地图对象
        mLocationClient = new LocationClient(this);
        initLocation();
    }

    private void initLocation() {
        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd09ll");
        option.setScanSpan(1000);
        //设置locationClientOption
        mLocationClient.setLocOption(option);
        //注册LocationListener监听器
        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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值