`
java-admin
  • 浏览: 1384706 次
  • 性别: 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
分享到:
评论

相关推荐

    基于Android平台的GPS开发研究.pdf

    本论文研究了基于Android平台的GPS开发,介绍了Android平台提供的与GPS开发相关的类和接口,分析了GPS相关程序开发的基本步骤,对同类的研究有一定的参考意义。 一、GPS原理 GPS技术起源于美国军方,其英文全称为...

    android开发培训实现GPS定位服务

    在Android开发中,实现GPS定位服务是移动应用中常见的需求,尤其对于地理位置相关的应用来说至关重要。本篇文章将探讨如何在Android环境下实现这一功能,并提供必要的步骤和代码示例。 首先,要启用GPS定位服务,...

    Android GPS 定位的实现

    Android GPS 定位的实现需要添加权限、判断 GPS 模块是否存在或者是开启、获取位置信息和显示位置信息四个步骤。通过使用 Google 地图,Android 平台可以实现 GPS 定位服务,满足各种定位需求。

    通过Criteria获得LocationProvider.zip

    Android系统提供了多种LocationProvider,如GPS(全球定位系统)和Network Provider(网络定位),它们分别通过卫星信号和移动网络来获取位置信息。 Criteria类是Android API提供的一种方式,用于定义我们对定位...

    androidGPS应用开发

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

    Android GPS

    首先,要使用Android的GPS服务,必须在应用的`AndroidManifest.xml`文件中声明相应的权限。这是通过添加以下代码行来实现的: ```xml &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"&gt; `...

    安卓GPS应用案例

    开发Android GPS应用时,理解如何有效地利用`LocationManager`、`locationProvider`和`Criteria`是至关重要的。这不仅涉及到获取和处理位置数据,还包括优化用户体验,如平衡位置更新的频率和精度与电池寿命之间的...

    安卓开发-Android之GPS定位.zip.zip

    在安卓开发中,GPS定位是实现移动应用地理位置功能的关键技术。Android系统提供了丰富的API来支持开发者获取设备的精确位置信息,这些API主要集中在`android.location`包中。本教程将深入探讨如何在Android应用程序...

    Android中地图开发时的常用类.pdf

    以下将详细介绍在Android地图开发中常用的几个关键类: 1. **MapController类** MapController是控制地图行为的核心类,它可以移动、缩放地图,并设置地图的中心点。例如,`animateTo(GeoPoint point)`方法可以使...

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

    在Android平台上,获取地理位置信息是移动应用开发中的常见需求。为了选择最佳的地理位置服务,Android提供了`Criteria`类,帮助开发者根据特定需求筛选最合适的定位服务。本篇将深入讲解如何利用`Criteria`来实现这...

    Android_GPS_定位

    在Android开发中,GPS定位是移动应用中常用的功能,用于获取用户的精确位置信息。以下是对Android GPS定位实现的详细解释: 1. **权限设置**: 在Android应用中使用GPS定位服务前,必须在`AndroidManifest.xml`...

    Android手机GPS定位开发.pdf

    【Android手机GPS定位开发】 Android系统为开发者提供了强大的地理定位服务API,允许应用程序获取设备的实时地理位置信息。这一服务不仅可以实现连续的定位更新,还可以通过Intent接收器在设备进入或离开特定地理...

    Android编程之实现GPS定位

    要实现GPS定位,需要使用Android的Location API,主要涉及到`LocationManager`和`LocationListener`。`LocationManager`服务负责管理各种位置提供者(如GPS和网络定位),`LocationListener`接口则用于监听位置更新...

    GPS-android.zip_android

    在Android平台上,GPS(全球定位系统)的使用是开发者实现位置服务的重要手段。本文将深入探讨如何在Android应用中实现GPS定位功能,并提供一个实际的代码示例。 首先,我们需要理解Android系统的定位框架。Android...

Global site tag (gtag.js) - Google Analytics