Android開發--使用者定位服務--UserLocation

來源:互聯網
上載者:User

[java] <span style="background-color: rgb(243, 248, 251); font-family: simsun;">使用者定位介紹:</span>   User Location的作用:1.擷取使用者的位置2.追蹤使用者的移動 User Location的關鍵API1.Location Manager:用於管理Android的使用者定位服務2.Location Providers:提供多種定位方式供開發人員選擇。  <1>GPS Provider  <2>Network Provider  <3>Passive 定位方式的分類:1.GPS定位:使用GPS衛星進行定位,需要在AndroidManifest.xml當中聲明如下許可權:    android.permission.ACCESS_FINE_LOCATION 2.NETWORK定位:使用訊號接收塔和WIFI存取點進行定位,需要在AndroidManifest.xml當中聲明如下許可權:    android.permission.ACCESS_FINE_LOCATION  或    android.permission.ACCESS_COARSE_LOCATION以上兩種定位方式的區別是GPS定位精度更高,但同時也更耗電 擷取使用者的當前位置:1.在AndroidManifest.xml當中聲明相應的許可權;2.擷取LocationManager對象;3.選擇LocationProvider;4.綁定LocationListener對象。  LocationListener有四個方法:1.onLocationChanged(Location location):當裝置的位置發生改變時調用    我們可以調用location.getLongitude()和location.getLatitude()來得到裝置所處的經度和緯度2.onProviderDisabled(String provider):當提供資料Provider禁用時調用3.onProviderEnabled(String provider):當提供資料的Provider使用時調用4.onStatusChanged(String provider,int status,Bundle extras):當狀態改變時  我們需要實現LocationListener的以上四個方法:[java]  <span style="font-size:18px;">private class TestLocationListener implements LocationListener{      @Override      public void onLocationChanged(Location location){          System.out.println(location.getLongitude());          System.out.println(location.getLatitude());      }          @Override      public void onProviderDisabled(String provider){          // do something you need      }         @Override      public void onProviderEnabled(String provider){          // do something you need      }        @Override      public void onStatusChanged(String provider,int status,Bundle extras){          // do something you need      }  }</span>   測試當前裝置的LocationProvider由於一般的裝置存在不止一種定位方法,所以在這裡給出尋找定位服務的方法:[java]  <span style="font-size:18px;">List<String> providers=locationManager.getAllProviders();              for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){                  String string=(String)iterator.next();                  Log.d("BruceZhang", string+"\n");</span>   由於有多個Provider,那麼就需要做出選擇,在這裡給出選擇最好的Provider的方法:此時需要用到一個類--Criteria下面是在Android SDK文檔上給出的解釋:A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.它提供了一系列的方法,設定使用者的需求,並最終給出使用者所需要的最佳的Provider,下面是文檔上對設定條件的解釋:[java] view plaincopy<span style="font-size:18px;">void   setAccuracy(int accuracy)  Indicates the desired accuracy for latitude and longitude.</span>  [java]  <span style="font-size:18px;">  void     setAltitudeRequired(boolean altitudeRequired)  Indicates whether the provider must provide altitude information.</span>  [java]  <span style="font-size:18px;">  void     setBearingAccuracy(int accuracy)  Indicates the desired bearing accuracy.</span>  [java <span style="font-size:18px;">  void     setBearingRequired(boolean bearingRequired)  Indicates whether the provider must provide bearing information.</span>  [java]  <span style="font-size:18px;">  void     setCostAllowed(boolean costAllowed)  Indicates whether the provider is allowed to incur monetary cost.</span>  [java]  <span style="font-size:18px;">  void     setHorizontalAccuracy(int accuracy)  Indicates the desired horizontal accuracy (latitude and longitude).</span>  [java] <span style="font-size:18px;">  void     setPowerRequirement(int level)  Indicates the desired maximum power level.</span>  [java]  <span style="font-size:18px;">  void     setSpeedAccuracy(int accuracy)  Indicates the desired speed accuracy.</span>  [java] view plaincopy<span style="font-size:18px;">  void     setSpeedRequired(boolean speedRequired)  Indicates whether the provider must provide speed information.</span>  [java] view plaincopy<span style="font-size:18px;">  void     setVerticalAccuracy(int accuracy)  Indicates the desired vertical accuracy (altitude).</span>   追蹤使用者的位置:對使用者的位置進行更新用到的方法和解釋如下:[java]  //          public void requestLocationUpdates (String provider,   //          long minTime, float minDistance, LocationListener listener)   //          Added in API level 1  //          Register for location updates using the named provider, and a pending intent.   //  //          Parameters  //          provider  the name of the provider with which to register   //          minTime  minimum time interval between location updates, in milliseconds   //          minDistance  minimum distance between location updates, in meters   //          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update                             locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,                       0, new TestLocationListener());   下面,給出一個例子,實現使用者的定位,取得支援的LocationProvider,根據條件擷取最佳的Provider:一下是實現的原始碼:[java]  public class MainActivity extends Activity {      private Button button;      private Button button2;      private Button button3;      private Button button4;      private LocationManager locationManager;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          button=(Button)findViewById(R.id.button1);          button2=(Button)findViewById(R.id.button2);          button3=(Button)findViewById(R.id.button3);          button4=(Button)findViewById(R.id.button4);          button.setOnClickListener(new ButtonListener());          button2.setOnClickListener(new ProviderButtonListener());          button3.setOnClickListener(new BestProviderButtonListener());          button4.setOnClickListener(new MyLocation());                    locationManager=(LocationManager)MainActivity.this.                  getSystemService(Context.LOCATION_SERVICE);      }            private class ButtonListener implements OnClickListener{            @Override          public void onClick(View v) {              // TODO Auto-generated method stub  //          LocationManager locationManager=(LocationManager)MainActivity.this.  //                  getSystemService(Context.LOCATION_SERVICE);              /*              * 各個參數的意義:              * 1.定義當前所使用的Location Provider              * 2.位置更新一次的最小時間間隔              * 3.位置更新的最小距離              * 4.綁定監聽器--位置發生變化會調用其中的方法              */              Log.d("BruceZhang", "Bond Success");  //          public void requestLocationUpdates (String provider,   //          long minTime, float minDistance, LocationListener listener)   //          Added in API level 1  //          Register for location updates using the named provider, and a pending intent.   //  //          Parameters  //          provider  the name of the provider with which to register   //          minTime  minimum time interval between location updates, in milliseconds   //          minDistance  minimum distance between location updates, in meters   //          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update                             locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,                       0, new TestLocationListener());          }                }            private class ProviderButtonListener implements OnClickListener{            @Override          public void onClick(View v) {              // TODO Auto-generated method stub              List<String> providers=locationManager.getAllProviders();              for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){                  String string=(String)iterator.next();                  Log.d("BruceZhang", string+"\n");              }          }                }            private class BestProviderButtonListener implements OnClickListener{            @Override          public void onClick(View v) {              // TODO Auto-generated method stub              Criteria criteria=new Criteria();              criteria.setAccuracy(Criteria.ACCURACY_FINE);              criteria.setPowerRequirement(Criteria.POWER_LOW);              criteria.setAltitudeRequired(false);              criteria.setSpeedRequired(false);              criteria.setCostAllowed(false);              //第二個參數設定為false時,不管當前的那個provider是否可用,都需要進行尋找,並根據條件設為最優              String provider=locationManager.getBestProvider(criteria, false);              Log.d("BruceZhang", "The best provider is:"+provider);          }                }            private class MyLocation implements OnClickListener{            @Override          public void onClick(View v) {              // TODO Auto-generated method stub              //對用使用者定位服務主要是中間兩個參數的設定              locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000,                       2000, new TestLocationListener());          }                }            private class TestLocationListener implements LocationListener{              //這個函數的參數是使用者當前的位置          @Override          public void onLocationChanged(Location arg0) {              // TODO Auto-generated method stub  //          Toast.makeText(MainActivity.this, "您當前的經度是:"+arg0.getLongitude()+" ,"+  //          "您當前的緯度是:"+arg0.getLatitude(),  //                  Toast.LENGTH_SHORT).show();              Log.d("BruceZhang", arg0.getLongitude()+"");              Log.d("BruceZhang", arg0.getLatitude()+"");          }            @Override          public void onProviderDisabled(String arg0) {              // TODO Auto-generated method stub                        }            @Override          public void onProviderEnabled(String arg0) {              // TODO Auto-generated method stub                        }            @Override  www.2cto.com        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {              // TODO Auto-generated method stub                        }                }        @Override      public boolean onCreateOptionsMenu(Menu menu) {          // Inflate the menu; this adds items to the action bar if it is present.          getMenuInflater().inflate(R.menu.activity_main, menu);          return true;      }    }   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.