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() + "\n"
                    + "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() + "\n"
                    + "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();
    }

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

原文地址:https://www.cnblogs.com/yuzhou1234/p/12530767.html

时间: 2024-11-02 11:43:17

Android位置服务开发的相关文章

Android 位置服务

原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.location位置API.Google Play Services中的google位置API提供更强大更高级的框架,自动处理位置provider.用户移动和位置安全.它也依据电池消耗情况调整位置更新策略.在大多数情况下,使用Location Services API,你将获得更好的电池性能,更合适的精度. 更

Android笔记三十二.Android位置服务及核心API

一.位置服务概念 1.位置服务 位置服务(Location-Based Services,LBS),又称定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供了与个空间位置相关的综合应用服务. 2.GPS与网络位置提供器 Android平台支持提供位置服务的API,可以利用GPS(Global Positioning System,全球定位系统)和Network Location Provider(网络位置提供器)来获得用户的位置. (1)GPS相对来说更精确,但它只能在户外

Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息

 1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务,基于位置的服务发展很迅速,涉及商务.医疗.工作和生活的各个方面,为用户提供定位.追踪和敏感区域警告等一系列服务.比如谷歌地图,百度地图,都需要通过位置服务. 2.Android平台下支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象:

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图 http://www.cnblogs.com/macroxu-1982/archive/2011/09/13/2174657.html 实现效果: 获取手机gps当前的位置,显示位置对于的google地图. 具体的步骤: 1 Step One  创建包含MapView控件的应用界面 <com.google.android.maps.MapView android:layout_width="fill

【Android】第18章 位置服务和手机定位&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-03-04 一.简介 目前,基于位置的服务发展迅速,已涉及到商务.医疗.定位.追踪.敏感区域警告.工作和生活等各个方面.定位服务融合了GPS定位.移动通信.导航等多种技术,从而获取用户终端设备的位置信息,为移动用户提供了与空间位置相关的综合应用服务. 这一章我们主要以安卓内置的定位服务和百度定位服务为例,演示定位服务(Location Service)的基本用法. 二.本章示例主界面 1.运行截图 2.MainActivity.cs

Android推送服务开发

由于公司之前使用的手机客户端推送服务是极光推送,给公司造成一年几十万的服务费,因此,公司决定开发自己的一套推送服务,初步的技术选型是: 服务端:netty4 关于netty框架在我的下面的博客里面我整理了相关资料,本来还有一些关于mina的由于时间原因暂时没整理出来. 为了便于自己测试,自己动手实现了如何使用netty完成服务端消息推送以及在Android客户端如何将接受到的信息显示在通知栏,整体思路大概是这样的: 服务端使用netty框架开启基于TCP监听服务. 客户端发起TCP连接(不关闭,

android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两者合起来先自动获取自己所在位置的经纬度然后与固定地点进行路径搜索时却弄不出来了,因为刚开始 写的两者在两个类中总是取不到经纬度值,后来将两者写到同一个类中去了,终于取到经纬度值了,也运行出来了.需要 在 BDLocationListener的onReceiveLocation里获取到经纬度值,因为已

基于java开发的开源代码GPS北斗位置服务监控平台

最近在研究位置服务平台,基于全球卫星定位技术(GNSS).互联网技术.空间地理信息技术(GIS).3G/4G无线通信技术,面向全国公众用户建立大容量.实时.稳定的位置信息服务运营平台.实现管理目标的实时位置跟踪,历史轨迹查询,超速.越区.防盗抢等报警, 远程控制.油量监控,数据统计分析与报表等功能.平台采用B/S.C/S混合结构设计:支持大容量并发定位数据:多源数据综合处理能力:面向用户的管理规则自定义:移动终端查询(微信.安卓.IOS).  ?提供软件各种功能定制, 不同公司GPS.北斗终端协