`
java-admin
  • 浏览: 1364018 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

GPS开发常用方法 和用Criteria确定android location providerGPS开发常用方法

阅读更多

GPS开发常用方法 和用Criteria确定android location providerGPS开发常用方法

取得LocationProvider

Java代码 复制代码
  1. public void getLocationProvider()    
  2.   {    
  3.     try    
  4.     {    
  5.       Criteria mCriteria01 = new Criteria();    
  6.       mCriteria01.setAccuracy(Criteria.ACCURACY_FINE);    
  7.       mCriteria01.setAltitudeRequired(false);    
  8.       mCriteria01.setBearingRequired(false);    
  9.       mCriteria01.setCostAllowed(true);    
  10.       mCriteria01.setPowerRequirement(Criteria.POWER_LOW);    
  11.       strLocationProvider =     
  12.       mLocationManager01.getBestProvider(mCriteria01, true);    
  13.           
  14.       mLocation01 = mLocationManager01.getLastKnownLocation    
  15.       (strLocationProvider);    
  16.     }    
  17.     catch(Exception e)    
  18.     {    
  19.       mTextView01.setText(e.toString());    
  20.       e.printStackTrace();    
  21.     }    
  22.   }   
public void getLocationProvider() 
  { 
    try 
    { 
      Criteria mCriteria01 = new Criteria(); 
      mCriteria01.setAccuracy(Criteria.ACCURACY_FINE); 
      mCriteria01.setAltitudeRequired(false); 
      mCriteria01.setBearingRequired(false); 
      mCriteria01.setCostAllowed(true); 
      mCriteria01.setPowerRequirement(Criteria.POWER_LOW); 
      strLocationProvider =  
      mLocationManager01.getBestProvider(mCriteria01, true); 
       
      mLocation01 = mLocationManager01.getLastKnownLocation 
      (strLocationProvider); 
    } 
    catch(Exception e) 
    { 
      mTextView01.setText(e.toString()); 
      e.printStackTrace(); 
    } 
  } 

获取经纬度,并返回GeoPoint对象
Java代码 复制代码
  1. private GeoPoint getGeoByLocation(Location location)   
  2.   {   
  3.     GeoPoint gp = null;   
  4.     try  
  5.     {   
  6.       /* 当Location存在 */  
  7.       if (location != null)   
  8.       {   
  9.         double geoLatitude = location.getLatitude()*1E6;   
  10.         double geoLongitude = location.getLongitude()*1E6;   
  11.         gp = new GeoPoint((int) geoLatitude, (int) geoLongitude);   
  12.       }   
  13.     }   
  14.     catch(Exception e)   
  15.     {   
  16.       e.printStackTrace();   
  17.     }   
  18.     return gp;   
  19.   }  
private GeoPoint getGeoByLocation(Location location)
  {
    GeoPoint gp = null;
    try
    {
      /* 当Location存在 */
      if (location != null)
      {
        double geoLatitude = location.getLatitude()*1E6;
        double geoLongitude = location.getLongitude()*1E6;
        gp = new GeoPoint((int) geoLatitude, (int) geoLongitude);
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    return gp;
  }

将经纬度转换成实际屏幕坐标
Java代码 复制代码
  1. Point myScreenCoords = new Point();   
  2. GeoPoint tmpGeoPoint = new GeoPoint((int)(mLocation.getLatitude()*1E6),(int)(mLocation.getLongitude()*1E6));   
  3. mapView.getProjection().toPixels(tmpGeoPoint, myScreenCoords);  
Point myScreenCoords = new Point();
GeoPoint tmpGeoPoint = new GeoPoint((int)(mLocation.getLatitude()*1E6),(int)(mLocation.getLongitude()*1E6));
mapView.getProjection().toPixels(tmpGeoPoint, myScreenCoords);


点击MapView任意一点获得坐标
Java代码 复制代码
  1. @Override    
  2. public boolean onTouchEvent(MotionEvent ev) {    
  3.     int actionType = ev.getAction();    
  4.     switch (actionType) {    
  5.     case MotionEvent.ACTION_UP:         
  6.             Projection proj = mapView.getProjection();    
  7.             GeoPoint loc = proj.fromPixels((int)arg0.getX(), (int)arg0.getY());     
  8.             String sirina=Double.toString(loc.getLongitudeE6()/1000000);    
  9.             String dolzina=Double.toString(loc.getLatitudeE6()/1000000);    
  10.        
  11.     }    
  12.     
  13.     return false;   
  14. }  
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    int actionType = ev.getAction(); 
    switch (actionType) { 
    case MotionEvent.ACTION_UP:      
            Projection proj = mapView.getProjection(); 
            GeoPoint loc = proj.fromPixels((int)arg0.getX(), (int)arg0.getY());  
            String sirina=Double.toString(loc.getLongitudeE6()/1000000); 
            String dolzina=Double.toString(loc.getLatitudeE6()/1000000); 
    
    } 
 
    return false;
}



经纬度改变来刷新地图
Java代码 复制代码
  1. public void refreshMapView()    
  2. {    
  3.   GeoPoint p = new GeoPoint((int)(dLat* 1E6), (int)(dLng* 1E6));    
  4.   mMapView01.displayZoomControls(true);   
  5.   /* 将Map的中点移至GeoPoint */  
  6.   mMapController01.animateTo(p);    
  7.   mMapController01.setZoom(intZoomLevel);    
  8. }   
  public void refreshMapView() 
  { 
    GeoPoint p = new GeoPoint((int)(dLat* 1E6), (int)(dLng* 1E6)); 
    mMapView01.displayZoomControls(true);
    /* 将Map的中点移至GeoPoint */
    mMapController01.animateTo(p); 
    mMapController01.setZoom(intZoomLevel); 
  } 


根据当前的经纬度,获取相关的一些地址信息
Java代码 复制代码
  1. /* 创建Geocoder对象 */  
  2.         //根据地理环境来确定编码   
  3.         //注意这个Locale是java.util.Locale包的类,获取当前系统设定的语言   
  4.         Geocoder gc = new Geocoder   
  5.         (EX09_05.this, Locale.getDefault());   
  6.            
  7.         /* 取出地理坐标经纬度 */  
  8.         double geoLatitude = (int)gp.getLatitudeE6()/1E6;   
  9.         double geoLongitude = (int)gp.getLongitudeE6()/1E6;   
  10.            
  11.         /* 自经纬度取得地址(可能有多行地址) */  
  12.         List<Address> lstAddress =    
  13.         gc.getFromLocation(geoLatitude, geoLongitude, 1);   
  14.            
  15.         StringBuilder sb = new StringBuilder();   
  16.            
  17.         /* 判断地址是否为多行 */  
  18.         if (lstAddress.size() > 0)   
  19.         {   
  20.           Address adsLocation = lstAddress.get(0);   
  21.   
  22.           for(int i=0;i<adsLocation.getMaxAddressLineIndex();i++)   
  23.           {   
  24.             sb.append(adsLocation.getAddressLine(i)).append("\n");   
  25.           }   
  26.           sb.append(adsLocation.getLocality()).append("\n");   
  27.           sb.append(adsLocation.getPostalCode()).append("\n");   
  28.           sb.append(adsLocation.getCountryName());   
  29.         }   
  30.           
/* 创建Geocoder对象 */
        //根据地理环境来确定编码
        //注意这个Locale是java.util.Locale包的类,获取当前系统设定的语言
        Geocoder gc = new Geocoder
        (EX09_05.this, Locale.getDefault());
        
        /* 取出地理坐标经纬度 */
        double geoLatitude = (int)gp.getLatitudeE6()/1E6;
        double geoLongitude = (int)gp.getLongitudeE6()/1E6;
        
        /* 自经纬度取得地址(可能有多行地址) */
        List<Address> lstAddress = 
        gc.getFromLocation(geoLatitude, geoLongitude, 1);
        
        StringBuilder sb = new StringBuilder();
        
        /* 判断地址是否为多行 */
        if (lstAddress.size() > 0)
        {
          Address adsLocation = lstAddress.get(0);

          for(int i=0;i<adsLocation.getMaxAddressLineIndex();i++)
          {
            sb.append(adsLocation.getAddressLine(i)).append("\n");
          }
          sb.append(adsLocation.getLocality()).append("\n");
          sb.append(adsLocation.getPostalCode()).append("\n");
          sb.append(adsLocation.getCountryName());
        }
        



根据输入地址,取得其GeoPoint对象
Java代码 复制代码
  1. private GeoPoint getGeoByAddress(String strSearchAddress)    
  2. {    
  3.   GeoPoint gp = null;    
  4.   try    
  5.   {    
  6.     if(strSearchAddress!="")    
  7.     {    
  8.       Geocoder mGeocoder01 = new Geocoder    
  9.       (EX09_07.this, Locale.getDefault());    
  10.           
  11.       List<Address> lstAddress = mGeocoder01.getFromLocationName   
  12.                          (strSearchAddress, 1);   
  13.       if (!lstAddress.isEmpty())    
  14.       {    
  15.         Address adsLocation = lstAddress.get(0);    
  16.         double geoLatitude = adsLocation.getLatitude()*1E6;    
  17.         double geoLongitude = adsLocation.getLongitude()*1E6;    
  18.         gp = new GeoPoint((int) geoLatitude, (int) geoLongitude);    
  19.       }    
  20.     }    
  21.   }    
  22.   catch (Exception e)    
  23.   {     
  24.     e.printStackTrace();     
  25.   }    
  26.   return gp;    
  27. }   
  private GeoPoint getGeoByAddress(String strSearchAddress) 
  { 
    GeoPoint gp = null; 
    try 
    { 
      if(strSearchAddress!="") 
      { 
        Geocoder mGeocoder01 = new Geocoder 
        (EX09_07.this, Locale.getDefault()); 
         
        List<Address> lstAddress = mGeocoder01.getFromLocationName
                           (strSearchAddress, 1);
        if (!lstAddress.isEmpty()) 
        { 
          Address adsLocation = lstAddress.get(0); 
          double geoLatitude = adsLocation.getLatitude()*1E6; 
          double geoLongitude = adsLocation.getLongitude()*1E6; 
          gp = new GeoPoint((int) geoLatitude, (int) geoLongitude); 
        } 
      } 
    } 
    catch (Exception e) 
    {  
      e.printStackTrace();  
    } 
    return gp; 
  } 


地图放大缩小按钮
Java代码 复制代码
  1. /* 放大Map的Button */  
  2.    mButton02 = (Button)findViewById(R.id.myButton2);    
  3.    mButton02.setOnClickListener(new Button.OnClickListener()    
  4.    {    
  5.        
  6.      public void onClick(View v)    
  7.      {    
  8.        intZoomLevel++;    
  9.        if(intZoomLevel>mMapView01.getMaxZoomLevel())    
  10.        {    
  11.          intZoomLevel = mMapView01.getMaxZoomLevel();    
  12.        }    
  13.        mMapController01.setZoom(intZoomLevel);    
  14.      }    
  15.    });    
  16.        
  17.    /* 缩小Map的Button */  
  18.    mButton03 = (Button)findViewById(R.id.myButton3);    
  19.    mButton03.setOnClickListener(new Button.OnClickListener()    
  20.    {    
  21.          
  22.      public void onClick(View v)    
  23.      {    
  24.        intZoomLevel--;    
  25.        if(intZoomLevel<1)    
  26.        {    
  27.          intZoomLevel = 1;    
  28.        }    
  29.        mMapController01.setZoom(intZoomLevel);    
  30.      }    
  31.    });  
 /* 放大Map的Button */
    mButton02 = (Button)findViewById(R.id.myButton2); 
    mButton02.setOnClickListener(new Button.OnClickListener() 
    { 
     
      public void onClick(View v) 
      { 
        intZoomLevel++; 
        if(intZoomLevel>mMapView01.getMaxZoomLevel()) 
        { 
          intZoomLevel = mMapView01.getMaxZoomLevel(); 
        } 
        mMapController01.setZoom(intZoomLevel); 
      } 
    }); 
     
    /* 缩小Map的Button */
    mButton03 = (Button)findViewById(R.id.myButton3); 
    mButton03.setOnClickListener(new Button.OnClickListener() 
    { 
       
      public void onClick(View v) 
      { 
        intZoomLevel--; 
        if(intZoomLevel<1) 
        { 
          intZoomLevel = 1; 
        } 
        mMapController01.setZoom(intZoomLevel); 
      } 
    });


以下文章转载:http://marshal.easymorse.com/archives/2528
android location provider有两个:

    * LocationManager.GPS_PROVIDER:GPS,精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫星信息,另外设备可能没有GPS模块;
    * LocationManager.NETWORK_PROVIDER:通过网络获取定位信息,精度低,耗电少,获取信息速度较快,不依赖GPS模块。

为了程序的通用性,希望动态选择location provider。对android通过Location API显示地址信息做了个别改动,可以看到使用了gps定位,精度较高:



这里使用到了Criteria,可根据当前设备情况自动选择哪种location provider。见
Java代码 复制代码
  1. LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   
  2.   
  3. Criteria criteria = new Criteria();   
  4. criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度   
  5. criteria.setAltitudeRequired(false);//不要求海拔信息   
  6. criteria.setBearingRequired(false);// 不要求方位信息   
  7. criteria.setCostAllowed(true);//是否允许付费   
  8. criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求   
  9.   
  10. location = locationManager   
  11.         .getLastKnownLocation(locationManager.getBestProvider(criteria, true));  
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度
criteria.setAltitudeRequired(false);//不要求海拔信息
criteria.setBearingRequired(false);// 不要求方位信息
criteria.setCostAllowed(true);//是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求

location = locationManager
        .getLastKnownLocation(locationManager.getBestProvider(criteria, true));

原来的写法很简单:
Java代码 复制代码
  1. LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   
  2.   
  3. location=locationManager.getLastKnownLocation(LocationManager.NETWORK  
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

location=locationManager.getLastKnownLocation(LocationManager.NETWORK)



http://qq361119908.iteye.com/blog/665074
分享到:
评论

相关推荐

    androidGPS应用开发

    GPS的应用开发,里面都是详细的代码还有注释 有一下内容: 支持GPS的核心API 获取LocationProvider 获取可用的LocationProvider 通过名称获取指定LocationProvider 根据Criteria获得LocationProvider

    DetachedCriteria Criteria 使用方法

    DetachedCriteria Criteria 使用方法 非常详细外加练习

    Criteria使用方法

    介绍了hibernate中 Criteria接口在实际开发过程中的常见使用方法及技巧

    Android使用criteria选择合适的地理位置服务实现方法

    本文实例讲述了Android使用criteria选择合适的地理位置服务实现方法。分享给大家供大家参考,具体如下: /* LocationActivity.java * @author octobershiner * 2011 7 24 * SE.HIT * 利用Criteria选择最优的...

    安卓GPS应用案例

    安卓GPS应用案例,LocationManager和locationProvider,Criteria

    hibernate criteria的使用方法

    hibernate criteria的使用方法

    获取Gps定位信息,Android源码实例

    初学者Android源码,获取Gps定位信息的Android源码实例,通过这个JAVA小项目,你可能学会GPS在Android手机中如何工作,定位和获取GPS等操作,代码中有注释,方便理解学习,部分代码注解:  public int InfoType;//...

    Android GPS定位

    多种GPS定位方式和定位研究开发心得,提供了百度定位 和 谷歌定位两种方式,基站、wifi、net定位。 google定位代码   package com.javenwong.google_gps; import android.app.Activity;import android.content....

    疯狂Android讲义源码

     1.3 Android常用开发工具的用法 10  1.3.1 创建、删除和浏览AVD 10  1.3.2 使用Android模拟器  (Emulator) 14  1.3.3 使用DDMS进行调试 15  1.3.4 Android Debug Bridge(ADB)  的用法 16  1.3.5 使用DX...

    criteria介绍与使用

    criteria的相关知识及其介绍,便于java编程中使用criteria进行相关操作。

    google_AIP 方法解释

    常用属性和方法 属性和方法 描述 GPS_PROVIDER 静态字符串常量,表明LocationProvider是GPS NETWORK_PROVIDER 静态字符串常量,表明LocationProvider是网络 addGpsStatusListener(GpsStatus.Listener listener) ...

    Criteria详解

    最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法

    疯狂Android讲义.part2

    1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器 (Emulator) 14 1.3.3 使用DDMS进行调试 15 1.3.4 Android Debug Bridge(ADB) 的用法 16 1.3.5 使用DX编译Android应用 ...

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    疯狂Android讲义.part1

    1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器 (Emulator) 14 1.3.3 使用DDMS进行调试 15 1.3.4 Android Debug Bridge(ADB) 的用法 16 1.3.5 使用DX编译Android应用 ...

    Android 获取经度 纬度 位置信息.rar

    Android 获取经度 纬度 位置信息,在Android系统的手机上运行后,会显示出纬度和经度信息,具体的方法请参见以下代码:  //方法:返回查询条件  public Criteria getCriteria(){   Criteria c = new Criteria(); ...

    通过Criteria获得LocationProvider.zip

    该代码简洁明了,能够实现获取LocationProvider的功能,且有相应的注释,易于读者理解。

    Android开发使用LocationManager实现定位服务

    gps定位,实测可用. 第一个是网络定位,第二个是GPS定位,第三个是直接取缓存。LocationManager本身提供了选择最好的provider的方法: // 获取最好的定位方式 String provider = locationManager....

Global site tag (gtag.js) - Google Analytics