Pro Android学习笔记(一一六) Location(2) LocationManager的位置获取

               

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying以及作者@恺风Wei

LocationManager提供两个主要功能:1、获取设备的地理位置(经纬度);2、当设备进入制定的地理位置,通过通过intent通知。

获取位置信息的基本方法

简单的代码片段如下:

private void getMyLocation(){
   //1、获取LocationManager,LocationManager是系统级别的服务
   LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    //2、获取有效的provider,并显示出来
    List<String> providerlist = manager.getAllProviders();       
    showProvider(providerlist); 
    
     //3、在LocationManger获取某个provider的位置信息        
    /* 获取位置更新使用getLastKnownLocation(),参数为provider的名字,系统提供预定义的有LocationManager.GPS_PROVIDER、LocationManager.NETWORK_PROVIDER以及PASSIVE_PROVIDER。如果未能获取任何信息,getLastKnownLocation(provider)将返回null。Location可以获取provider的名字,经纬度,高度,速度,方位(bearing),精确度等等,用getXXX()获取,对于非常规数据在获取之前可以通过hasXXX()来判断有否该信息 */
    Location locate = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    showInfo("loc = " + loc);    
}

private void showProvider(List<String> list){
    showInfo("show providers : ");
    for(int i = 0 ; i < list.size(); i ++){ 
        showInfo("(" +i +")" + list.get(i));
    }
}

private void showInfo(String info){
    Log.i("WEI",info);
}

此外,我们必须在AndroidManifest.xml授予相应的权限。相关权限有两个: 1、android.permission.ACCESS_FINE_LOCATION;2、android.permission.ACCESS_COARSE_LOCATION。其中fine(精确)已经涵盖了coarse(粗糙),如果我们定义了fine,就不需要在授予coarse。GPS和Passive需要fine,而network可以使用coarse。

下面是查看provider的结果:

network即通过基站或者wifi的方式获取位置信息,GPS不用解释。Passive,即被动方式,是位置更新监测器,当其他App获取地理位置时,向你的App进行位置更新,而你的APP并不需要请求位置更新。至于hybrid是混合方式,不是Android系统的标准方式。而在模拟器中缺省提供gps和passive这两种方式。

模拟器上的位置模拟

在模拟器,我们可以通过DDMS的Emulator control来设定位置信息。

此外我们还可以通过telnet到模拟器,通过命令上进行设置,下面是通过SecureCRT telnet到值模拟器(telnet localhost 5554),相关命令为geo fix <latitude> <longitude>或者geo fix <latitude> <longitude> <altitude>

获取provider

getAllProviders()获得的提供商列表,而getProvider(LocationManager.GPS_PROVIDER)则可以获取指定供应商的名称。但是这两种获取方式,获得包括目前无法访问的,也就是最终返回的Location为null。

我们可以通过getProviders(true),只返回有效的供应商列表,或者用isProviderEnabled(String providerName)来看看供应商是否有效。但是这同样亦有问题,如果我们关闭手机的GPS,返回的列表中没有gps,或者查询到无效,当时当我们开启手机的GPS时,有可能并没有搜索到卫星,这是gps仍出现在有效的供应商列表,或者查询是enabled的,但location仍会返回null。

我们希望能获得最适合我们需求的供应商,相关代码如下:

private void getMyLocation1(){
    LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    //设置我们的标准Criteria,可以用setXXX(),例如criteria.setAccuracy(int);提出我具体的要求,例如精度要求等,如果没有什么特别的要求,也就无需进行设置
    Criteria criteria = new Criteria();
    //通过getBestProvider获得满足要求的最佳供应商,也可以通过getProviders(criteria, true)获取符合要求的供应商列表。在没有搜索到足够卫星时,系统会返回其他方式,如network。 
    String providerName = manager.getBestProvider(criteria, true/*true表示enabledOnly*/);
    showInfo("Best provider is " + providerName);
   
    if(providerName != null){
        Location locate = manager.getLastKnownLocation(providerName);
        showLocation(locate);
    }
}

进行相关设置

设备可能没有开启GPS,获取关闭了所有的地理信息获取方法,如果检查到没有开启地理服务,弹出系统设置给用户,由用户进行设置,在设置结束后,再次进行位置获取。相关代码如下:

private LocationManager manager = null;
private void getMyLocation2(){
    if(manager == null)
        manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    boolean isGpsAvalible = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if(!isGpsAvalible){ //打开location设置的activity
       startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0);

    }else{
        getFromGps();
    }
}   

@Override //当用户设置后按返回键,触发onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 
    super.onActivityResult(requestCode, resultCode, data);
    getFromGps();
}

private void getFromGps(){
    //用户不一定会在系统设置中开启,故需要再次检测!
    boolean isGpsAvalible = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if(isGpsAvalible){
        Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        showLocation(location);
    }
}

Location信息

我们可以用hasXXX()来获得是否供应商提供了某个位置信息,用getXXX()来获取具体的位置信息,下面是例子。如果提供商是GSP,卫星的数目放在extra中。

Log.d("WEI","longtitude = " + loc.getLongitude());
Log.d("WEI","lantitude = " + loc.getLatitude());

boolean isAvalible = loc.hasAccuracy();
Log.d("WEI","hasAccuracy = " + loc.hasAccuracy());
if(isAvalible)
Log.d("WEI","accuracy = " + loc.getAccuracy());

Bundle b = loc.getExtras();

if(b!= null){
      Log.d("WEI","satellites num = " + b.getInt("satellites"));
}

Location类提供两个地点之间的距离计算,distanceTo()和静态方法distanceBetween()。这里给出的是最短的地理距离,而非两者间的交通距离(例如驾车距离),如果要获得最短的驾车线路和距离,需要地图供应商,例如Google Map。

 【注意】虽然,GPS在实际应用中更为常用,但在室内进行开发调测中,使用network更为稳定,因此如果是用实体机调测,建议采用network方式。对于模拟器,最好使用具有Google APIs的版本,以确保DDMS中位置模拟的正常使用。

小例子代码在:Pro Android学习:location小例子

相关链接:我的Android开发相关文章

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

作者intuit,代码LocationManager。 INTULocationManager可以轻松获取设备在iOS上的当前位置和标题。 它是一个Objective-C库,在Swift中也很有用。 INTULocationManager提供基于块的异步API,以便一次或连续地请求当前位置。 它在内部管理多个同时位置和标题请求,每个一次性位置请求可以指定其自己所需的准确度和超时持续时间。 当第一个请求进入时,INTULocationManager会自动启动位置服务,并在所有请求完成后立即停止位置服务,同时动态管理位置服务所消耗的功率,以减少对电池寿命的影响。 CLLocationManager有什么问题? CLLocationManager要求您手动检测和处理权限,陈旧/不准确的位置,错误等内容。 CLLocationManager使用更传统的委托模式而不是现代的基于块的回调模式。虽然它可以很好地跟踪用户位置随时间的变化(例如用于逐向导航),但是正确请求单个位置更新(例如确定用户当前城市以获取天气)非常麻烦预测,或从当前位置自动填充地址)。 INTULocationManager可以轻松地同时或连续请求设备的当前位置以及设备的连续标题。对于一次性位置请求和定期更新的定期订阅,API非常简单。对于一次性位置请求,您可以指定所需位置的准确程度,以及您愿意等待多长时间。还支持重要的位置变更监控。 INTULocationManager具有高能效,可通过自动确定和使用最有效的核心位置精度设置,以及在不再需要位置服务(例如GPS或指南针)时自动断电,从而节省设备的电池电量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值