EX09_05.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:6k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex09_05;
  2. import java.util.List;
  3. import java.util.Locale;
  4. import com.google.android.maps.GeoPoint;
  5. import com.google.android.maps.MapActivity;
  6. import com.google.android.maps.MapController;
  7. import com.google.android.maps.MapView;
  8. import android.content.Context;
  9. import android.location.Address;
  10. import android.location.Criteria;
  11. import android.location.Geocoder;
  12. import android.location.Location;
  13. import android.location.LocationListener;
  14. import android.location.LocationManager;
  15. import android.os.Bundle;
  16. import android.widget.TextView;
  17. public class EX09_05 extends MapActivity
  18. {
  19.   private LocationManager mLocationManager01;
  20.   private String strLocationProvider = "";
  21.   private Location mLocation01=null;
  22.   private TextView mTextView01;
  23.   private MapView mMapView01;
  24.   private GeoPoint currentGeoPoint;
  25.   private int intZoomLevel = 20;
  26.   @Override
  27.   protected void onCreate(Bundle icicle)
  28.   {
  29.     // TODO Auto-generated method stub
  30.     super.onCreate(icicle);
  31.     setContentView(R.layout.main);
  32.     
  33.     mTextView01 = (TextView)findViewById(R.id.myTextView1);
  34.     /* 创建MapView对象 */
  35.     mMapView01 = (MapView)findViewById(R.id.myMapView1);
  36.     
  37.     /* 创建LocationManager对象取得系统LOCATION服务 */
  38.     mLocationManager01 = 
  39.     (LocationManager)getSystemService(Context.LOCATION_SERVICE);
  40.     
  41.     /* 第一次运行向Location Provider取得Location */
  42.     mLocation01 = getLocationProvider(mLocationManager01);
  43.     
  44.     if(mLocation01!=null)
  45.     {
  46.       processLocationUpdated(mLocation01);
  47.     }
  48.     else
  49.     {
  50.       mTextView01.setText
  51.       (
  52.         getResources().getText(R.string.str_err_location).toString()
  53.       );
  54.     }
  55.     /* 创建LocationManager对象,监听Location更改时事件,更新MapView */
  56.     mLocationManager01.requestLocationUpdates
  57.     (strLocationProvider, 2000, 10, mLocationListener01);
  58.   }
  59.   
  60.   public final LocationListener 
  61.   mLocationListener01 = new LocationListener()
  62.   {
  63.     @Override
  64.     public void onLocationChanged(Location location)
  65.     {
  66.       // TODO Auto-generated method stub
  67.       
  68.       /* 当手机收到位置更改时,将location传入取得地理坐标 */
  69.       processLocationUpdated(location);
  70.     }
  71.     
  72.     @Override
  73.     public void onProviderDisabled(String provider)
  74.     {
  75.       // TODO Auto-generated method stub
  76.       /* 当Provider已离开服务范围时 */
  77.     }
  78.     
  79.     @Override
  80.     public void onProviderEnabled(String provider)
  81.     {
  82.       // TODO Auto-generated method stub
  83.     }
  84.     
  85.     @Override
  86.     public void onStatusChanged
  87.     (String provider, int status, Bundle extras)
  88.     {
  89.       // TODO Auto-generated method stub
  90.       
  91.     }
  92.   };
  93.   
  94.   public String getAddressbyGeoPoint(GeoPoint gp)
  95.   {
  96.     String strReturn = "";
  97.     try
  98.     {
  99.       /* 当GeoPoint不等于null */
  100.       if (gp != null)
  101.       {
  102.         /* 创建Geocoder对象 */
  103.         Geocoder gc = new Geocoder
  104.         (EX09_05.this, Locale.getDefault());
  105.         
  106.         /* 取出地理坐标经纬度 */
  107.         double geoLatitude = (int)gp.getLatitudeE6()/1E6;
  108.         double geoLongitude = (int)gp.getLongitudeE6()/1E6;
  109.         
  110.         /* 自经纬度取得地址(可能有多行地址) */
  111.         List<Address> lstAddress = 
  112.         gc.getFromLocation(geoLatitude, geoLongitude, 1);
  113.         
  114.         StringBuilder sb = new StringBuilder();
  115.         
  116.         /* 判断地址是否为多行 */
  117.         if (lstAddress.size() > 0)
  118.         {
  119.           Address adsLocation = lstAddress.get(0);
  120.           for(int i=0;i<adsLocation.getMaxAddressLineIndex();i++)
  121.           {
  122.             sb.append(adsLocation.getAddressLine(i)).append("n");
  123.           }
  124.           sb.append(adsLocation.getLocality()).append("n");
  125.           sb.append(adsLocation.getPostalCode()).append("n");
  126.           sb.append(adsLocation.getCountryName());
  127.         }
  128.         
  129.         /* 
  130.         * 将撷取到的地址
  131.         * 组合后放在StringBuilder对象中输出用
  132.         */
  133.         strReturn = sb.toString();
  134.       }
  135.     }
  136.     catch(Exception e)
  137.     {
  138.       e.printStackTrace();
  139.     }
  140.     return strReturn;
  141.   }
  142.   
  143.   public Location getLocationProvider(LocationManager lm)
  144.   {
  145.     Location retLocation = null;
  146.     try
  147.     {
  148.       Criteria mCriteria01 = new Criteria();
  149.       mCriteria01.setAccuracy(Criteria.ACCURACY_FINE);
  150.       mCriteria01.setAltitudeRequired(false);
  151.       mCriteria01.setBearingRequired(false);
  152.       mCriteria01.setCostAllowed(true);
  153.       mCriteria01.setPowerRequirement(Criteria.POWER_LOW);
  154.       strLocationProvider = lm.getBestProvider(mCriteria01, true);
  155.       retLocation = lm.getLastKnownLocation(strLocationProvider);
  156.     }
  157.     catch(Exception e)
  158.     {
  159.       mTextView01.setText(e.toString());
  160.       e.printStackTrace();
  161.     }
  162.     return retLocation;
  163.   }
  164.   
  165.   private GeoPoint getGeoByLocation(Location location)
  166.   {
  167.     GeoPoint gp = null;
  168.     try
  169.     {
  170.       /* 当Location存在 */
  171.       if (location != null)
  172.       {
  173.         double geoLatitude = location.getLatitude()*1E6;
  174.         double geoLongitude = location.getLongitude()*1E6;
  175.         gp = new GeoPoint((int) geoLatitude, (int) geoLongitude);
  176.       }
  177.     }
  178.     catch(Exception e)
  179.     {
  180.       e.printStackTrace();
  181.     }
  182.     return gp;
  183.   }
  184.   
  185.   public static void refreshMapViewByGeoPoint
  186.   (GeoPoint gp, MapView mv, int zoomLevel, boolean bIfSatellite)
  187.   {
  188.     try
  189.     {
  190.       mv.displayZoomControls(true);
  191.       /* 取得MapView的MapController */
  192.       MapController mc = mv.getController();
  193.       /* 移至该地理坐标地址 */
  194.       mc.animateTo(gp);
  195.       
  196.       /* 放大地图层级 */
  197.       mc.setZoom(zoomLevel);
  198.       
  199.       /* 设置MapView的显示选项(卫星、街道)*/
  200.       if(bIfSatellite)
  201.       {
  202.         mv.setSatellite(true);
  203.         mv.setStreetView(true);
  204.       }
  205.       else
  206.       {
  207.         mv.setSatellite(false);
  208.       }
  209.     }
  210.     catch(Exception e)
  211.     {
  212.       e.printStackTrace();
  213.     }
  214.   }
  215.   
  216.   /* 当手机收到位置更改,将location传入GeoPoint及MapView */
  217.   private void processLocationUpdated(Location location)
  218.   {
  219.     /* 传入Location对象,取得GeoPoint地理坐标 */
  220.     currentGeoPoint = getGeoByLocation(location);
  221.     
  222.     /* 更新MapView显示Google Map */
  223.     refreshMapViewByGeoPoint
  224.     (currentGeoPoint, mMapView01, intZoomLevel, true);
  225.     
  226.     mTextView01.setText
  227.     (
  228.       getResources().getText(R.string.str_my_location).toString()+
  229.       "n"+getAddressbyGeoPoint(currentGeoPoint)
  230.     );
  231.   }
  232.   
  233.   @Override
  234.   protected boolean isRouteDisplayed()
  235.   {
  236.     // TODO Auto-generated method stub
  237.     return false;
  238.   }
  239. }