• Android位置服务开发


    1. 使用LocationManager获取地理位置信息

    代码如下:

    private TextView positiontext;
    	private String provider;
    	private LocationManager manager;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		positiontext = (TextView) findViewById(R.id.tv_show1);
    
    		// 使用LocationManager获取地理位置信息,先得到LocationManager对象
    		// 调用Context的getSystemService()方法接受一个字符串用于确定获取系统的哪个服务
    		// 传入Context.LOCATION_SERVICE这个服务
    		manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
    		// 先用一个List集合获取所有可用的位置提供器
    		List<String> providerlist = manager.getProviders(true);
    
    		// 选择一个位置提供器来确定设备当前位置,有三种可供选择,但是必须在设置中提前打开相关权限
    		// NETWORK_PROVIDER使用网络定位,精度差,耗电量少,用的较多
    		// GPS_PROVIDER使用GPS定位,精度高,耗电量高,用得较多
    		// PASSIVE_PROVIDER用的较少
    		if (providerlist.contains(LocationManager.GPS_PROVIDER)) {
    			provider = LocationManager.GPS_PROVIDER;
    		} else if (providerlist.contains(LocationManager.NETWORK_PROVIDER)) {
    			provider = LocationManager.NETWORK_PROVIDER;
    		} else {
    			Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_LONG).show();
    		}
    
    		// 将选择好的位置提供器传入到getLastKnownLocation()得到一个Location对象;
    		// 这个Location对象中包含了经度、纬度、海拔等一系列信息,然后提取需要的信息
    		Location location = manager.getLastKnownLocation(provider);
    
    		if (location != null) {
    
    			// 显示当前的位置信息
    			positiontext.setText("latitude is " + location.getLatitude() + "
    "
    					+ "Longitude is " + location.getLongitude());
    
    		}
    
    		// requestLocationUpdates()方法实时更新用户的位置信息,接收四个参数
    		// ①第一个参数是位置提供器的类型
    		// ②第二个参数是监听位置变化间隔的毫秒数
    		// ③第三个参数是监听位置变化间隔的距离,达到设定距离时,触发第四个参数的监听器的onLocationChanged()方法,
    		// 并把新的位置信息作为参数传入
    		// ④第四个参数是LocationListener()监听器接口,所以应该传入的是它的实现类的对象
    		manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10,
    				listener);
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		// 关闭程序时将监听器移除
    		if (manager != null) {
    			manager.removeUpdates(listener);
    		}
    	}
    
    	// 定义LocationListener()监听器接口的实现类
    	LocationListener listener = new LocationListener() {
    
    		@Override
    		public void onStatusChanged(String provider, int status, Bundle extras) {
    
    		}
    
    		@Override
    		public void onProviderEnabled(String provider) {
    
    		}
    
    		@Override
    		public void onProviderDisabled(String provider) {
    
    		}
    
    		@Override
    		public void onLocationChanged(Location location) {
    			// 更新当前位置信息
    			positiontext.setText("latitude is " + location.getLatitude() + "
    "
    					+ "Longitude is " + location.getLongitude());
    
    		}
    	};
    

    注意事项:Manifest文件中添加权限

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    2. 使用百度地图显示

    ①登录网址

    http://lbsyun.baidu.com/apiconsole/key

    注册成为一名百度开发者,并申请API Key,注册页面如下

    注册成功,点击邮箱链接激活

    接下来正式申请API Key,注意事项看下面两图

    特别注意,每开发一个程序都应该重新申请Key,因为每次的包名不一样

    点击提交之后就会看到自己申请的Key了

    接下来进入这个网址

    http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download

    下载Android版的SDK,接下来由于新旧版本以及指导书籍的不同,会有不同的做法,对我这个来说,我用的是Eclipse+新版本的baiduAPI,找了好久在网上找到一篇可以使用的教程链接是

    http://blog.csdn.net/chenyufeng1991/article/details/46980733

    以下详细介绍配置过程

    ①如下图所示,箭头所指的地方都打勾,点击开发包进行下载

    ②下载完成后,会有多个jar包和一个armabi文件夹,把jar包和armabi文件夹复制到Eclipse工程目录下的libs文件夹下。如图:

    ③在百度服务器端的配置已经全部完成,下面开始写代码,在AndroidMenifest.xml中添加:

    这里特别注意,添加的这一段代码必须放在原来的application里面位置,如下面代码所示

    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="BtM2ugHA16R8fvdyAc5cyxR9Q6GGMyoF" />
    
            <activity
                android:name=".SecondActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
            </activity>
    </application>
    

    ④添加权限:参考百度开发文档链接见⑦

     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <!-- 这是使用LocationManager获取地理位置信息的时候要用的权限 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!-- //获取设备网络状态,禁用后无法获取网络状态 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <!-- //网络权限,当禁用后,无法进行检索等相关业务 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!-- //读取设备硬件信息,统计数据 -->
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <!-- //读取系统信息,包含系统版本等信息,用作统计 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!-- //获取设备的网络状态,鉴权所需网络代理 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!-- //允许sd卡写权限,需写入地图数据,禁用后无法显示地图 -->
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <!-- //获取统计数据 -->
        <uses-permission android:name="android.permission.GET_TASKS" />
        <!-- //鉴权所需该权限获取进程列表 -->
        <uses-permission android:name="android.permission.CAMERA" />
        <!-- //使用步行AR导航,配置Camera权限 -->
    

    ⑤在布局文件中添加地图控件:

    特别注意,这里的代码提示不会体现出来,所以需要自己敲出这些代码

    <com.baidu.mapapi.map.MapView  
           android:id="@+id/bmapView"  
           android:layout_width="fill_parent"  
           android:layout_height="fill_parent"  
           android:clickable="true" /> 
    

    ⑥在MainActivity.java中添加代码:

    MapView mMapView = null;// 用于显示地图的控件;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		// 初始化地图SDK,注意一定要写在
    		// setContentView(R.layout.activity_main)代码前
    		SDKInitializer.initialize(getApplicationContext());
    		setContentView(R.layout.activity_second);
    
    		// 绑定控件;
    		mMapView = (MapView) findViewById(R.id.bmapView);
    
    	}
    
    	@Override
    	protected void onResume() {
    		super.onResume();
    		// 管理地图的生命周期:显示
    		mMapView.onResume();
    	}
    
    	@Override
    	protected void onPause() {
    		super.onPause();
    		// 管理地图的生命周期:暂停
    		mMapView.onPause();
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		// 管理地图的生命周期:销毁
    		mMapView.onDestroy();
    	}
    

    ⑦具体更多内容请参考百度地图开发文档:

    http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap

    3. 使用百度地图定位到自己的位置

    地图显示出来之后默认的是北京的地图,要定位到自己的位置需要加入下面代码

    MapView mMapView = null;// 用于显示地图的控件;
    	private BaiduMap map; // 百度地图提供的总控制器类
    	private boolean showmapflag = true;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		// 初始化地图SDK,注意一定要写在
    		// setContentView(R.layout.activity_main);代码前;
    
    		Intent intent = getIntent();
    		String data = intent.getStringExtra("extra_data");
    		SDKInitializer.initialize(getApplicationContext());
    		setContentView(R.layout.activity_second);
    
    		// 绑定控件;
    		mMapView = (MapView) findViewById(R.id.bmapView);
    		// 获取BaiduMap对象
    		map = mMapView.getMap();
    
    		// 开始将经纬度坐标显示到地图的具体位置上
    		if (showmapflag == true) {
    
    			String[] location_data = data.split("=");
    			// 借助LatLng类让地图定位到某一个经纬度,传入的参数是double类型的经纬度坐标值
    			double my_latitude = Double.parseDouble(location_data[0]);
    			double my_longitude = Double.parseDouble(location_data[1]);
    			LatLng lng = new LatLng(my_latitude, my_longitude);
    
    			// animateMapStatus()将地图定位到指定的经纬度上
    			MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(lng);
    			map.animateMapStatus(update);
    
    			// 这里用来设置地图的缩放级别
    			// MapStatusUpdateFactory的zoomTo()方法传入3-19之间的float数据
    			update = MapStatusUpdateFactory.zoomTo(12f);
    			map.animateMapStatus(update);
    
    			// 这个变量的作用是防止多次调用animateMapStatus()方法,
    			// 因为我们不动,只需要在程序第一次定位的时候显示一次即可
    			showmapflag = false;
    
    		}
    
    	}
    

    4. 使用百度地图定位到自己的位置并标记出来

    ①开启功能

    // 设置设备显示在地图上的功能开启,否则设备的位置无法显示在地图上
    		map.setMyLocationEnabled(true);
    

    ②设备位置显示

    // 这是用来在地图上标记自己位置的代码,这段代码必须在if(showmapflag == true)语句
    		// 的外面,因为地图只需要加载一次,但是自己的位置应该是实时更新的
    		// MyLocationData.Builder类用来封装设备当前所在位置的
    		MyLocationData.Builder builder = new MyLocationData.Builder();
    
    		// 将经纬度传入MyLocationData.Builder类对应的方法中
    		builder.latitude(my_latitude);
    		builder.longitude(my_longitude);
    
    		// build()方法生成一个MyLocationData对象
    		MyLocationData locationData = builder.build();
    
    		// 将MyLocationData对象传入到BaiduMap的setMyLocationData()方法中
    		// 就可以在地图上将自己的位置显示出来
    		map.setMyLocationData(locationData);
    

    ③功能关闭

    @Override
    	protected void onDestroy() {
    		super.onDestroy();
    		// 程序退出时设置设备显示在地图上的功能关闭
    		map.setMyLocationEnabled(false);
    		// 管理地图的生命周期:销毁
    		mMapView.onDestroy();
    	}
    

    了解更多技术文章,欢迎关注我的个人公众号

  • 相关阅读:
    IOS应用内嵌cocos2dx游戏项目
    C++ 动态内存
    C++ 文件和流
    【转】SQL中的锁、脏读、不可重复的读及虚读
    【转】WCF扩展系列
    【转】WCF设置拦截器捕捉到request和reply消息
    关于拦截器模式的理解
    【转】netty源码分析之LengthFieldBasedFrameDecoder
    【转】使用nginx搭建高可用,高并发的wcf集群
    【转】Nginx 反向代理 负载均衡 虚拟主机配置
  • 原文地址:https://www.cnblogs.com/yuzhou1234/p/12530767.html
Copyright © 2020-2023  润新知