Android可以通過多種方式獲取用戶位置。本文主要將GPS和NETWORK兩種方式。
先簡單的介紹下怎么在Android設備上獲取用戶位置。
- //獲取系統(tǒng)位置服務的引用
- LocationManagerlocationManager=(LocationManager) this .getSystemService(Context.LOCATION_SERVICE);
- //定義對位置變化的監(jiān)聽函數(shù)
- LocationListenerlocationListener= new LocationListener(){
- public void onLocationChanged(Locationlocation){
- //Calledwhenanewlocationisfoundbythenetworklocationprovider.
- makeUseOfNewLocation(location);
- }
- public void onStatusChanged(Stringprovider, int status,Bundleextras){}
- public void onProviderEnabled(Stringprovider){}
- public void onProviderDisabled(Stringprovider){}
- };
- //向位置服務注冊監(jiān)聽函數(shù)來接受位置更新
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0 , 0 ,locationListener);
首先要獲取LocationManager對象,LocationManager不能直接new出來,他是系統(tǒng)的一項服務。
requestLocationUpdates()方法是來更新用戶的位置的。第一個參數(shù)是Location Provider(位置提供者)的使用類型。(本例中使用的是基于手機信號塔和Wi_FI基站的網(wǎng)絡位置提供者)。二個參數(shù)是通知之間的最小時間間隔(單位微秒),第三個是通知之間最小的距離變化(單位米)。將兩個的值設置為零可以盡可能頻繁的獲取位置的通知。最后一個參數(shù)是 接受位置更新回調函數(shù)LocationListener。
為了使用GPS提供者來獲取位置的更新,可以將NETWORK_PROVIDER.更改為GPS_PROVIDER。也可以通過兩次調用requestLocationUpdates()(一次 NETWORK_PROVIDER ,一次GPS_PROVIDER.)來同時使用GPS和Network Location 內容提供者獲取位置更新。
為了能夠接受來自 NETWORK_PROVIDER或者GPS_PROVIDER的位置更新,必須在Android 的mainifest的文件中聲明ACCESS_COARSE_LOCATION 或者ACCESS_FINE_LOCATION的用戶權限。如果沒有這些權限,會報錯。NETWORK_PROVIDER需要ACCESS_COARSE_LOCATION權限(粗糙的定位權限),GPS_PROVIDER需要ACCESS_FINE_LOCATION權限(精確的定位權限)。當然,如果有ACCESS_FINE_LOCATION權限,NETWORK_PROVIDER和GPS_PROVIDER都能用 。
LocationListener中的四個回調函數(shù)
onLocationChanged:當位置變化時調用
onStatusChanged: 此方法在 Provider 的狀態(tài)在可用、暫時不可用和無服務三個狀態(tài)直接切換時被調用。 試了一下,在位置提供者為network的前提下,聯(lián)網(wǎng)和斷網(wǎng)此方法會被調用
onProviderEnabled和onProviderDisabled:provider 被用戶開啟或關閉后調用 。試了一下,在位置提供者為GPS的前提下,打開和關閉GPS此方法會被調用。
最后附上一個Demo:
- package com.tianjf.locationgpsdemo;
- import android.app.Activity;
- import android.content.Context;
- import android.content.Intent;
- import android.location.Criteria;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.os.Bundle;
- import android.provider.Settings;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity{
- TextViewmTextView;
- LocationManagermLocationManager;
- @Override
- protected void onCreate(BundlesavedInstanceState){
- super .onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mTextView=(TextView)findViewById(R.id.text_view);
- mLocationManager=(LocationManager) this
- .getSystemService(Context.LOCATION_SERVICE);
- openGPSSetting();
- getLocation();
- }
- private void openGPSSetting(){
- if (mLocationManager
- .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
- Toast.makeText( this , "GPS模塊正常" ,Toast.LENGTH_SHORT).show();
- return ;
- }
- Toast.makeText( this , "請開啟GPS!" ,Toast.LENGTH_SHORT).show();
- //跳轉到GPS的設置頁面
- Intentintent= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
- startActivityForResult(intent, 0 ); //此為設置完成后返回到獲取界面
- }
- private void getLocation(){
- //android通過criteria選擇合適的地理位置服務
- Criteriacriteria= new Criteria();
- criteria.setAccuracy(Criteria.ACCURACY_FINE); //高精度
- criteria.setAltitudeRequired( false ); //設置不需要獲取海拔方向數(shù)據(jù)
- criteria.setBearingRequired( false ); //設置不需要獲取方位數(shù)據(jù)
- criteria.setCostAllowed( true ); //設置允許產(chǎn)生資費
- criteria.setPowerRequirement(Criteria.POWER_LOW); //低功耗
- Stringprovider=mLocationManager.getBestProvider(criteria, true ); //獲取GPS信息
- Locationlocation=mLocationManager.getLastKnownLocation(provider); //通過GPS獲取位置
- updateUIToNewLocation(location);
- //設置監(jiān)聽器,自動更新的最小時間為間隔N秒(這里的單位是微秒)或最小位移變化超過N米(這里的單位是米)
- mLocationManager.requestLocationUpdates(provider, 1 * 1000 , 0 .00001F,
- locationListener);
- }
- private void updateUIToNewLocation(Locationlocation){
- if (location!= null ){
- mTextView.setText( "緯度:" +location.getLatitude()+ "\n經(jīng)度"
- +location.getLongitude());
- //Location類的方法:
- //getAccuracy():精度(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)
- //getAltitude():海撥
- //getBearing():方位,行動方向
- //getLatitude():緯度
- //getLongitude():經(jīng)度
- //getProvider():位置提供者(GPS/NETWORK)
- //getSpeed():速度
- //getTime():時刻
- } else {
- mTextView.setText( "無法獲取地理信息" );
- }
- }
- //定義對位置變化的監(jiān)聽函數(shù)
- LocationListenerlocationListener= new LocationListener(){
- public void onLocationChanged(Locationlocation){
- System.out.println( "onLocationChanged" );
- System.out.println( "緯度:" +location.getLatitude()+ "\n經(jīng)度"
- +location.getLongitude());
- }
- public void onStatusChanged(Stringprovider, int status,Bundleextras){
- System.out.println( "onStatusChanged" );
- System.out.println( "privider:" +provider);
- System.out.println( "status:" +status);
- System.out.println( "extras:" +extras);
- }
- public void onProviderEnabled(Stringprovider){
- System.out.println( "onProviderEnabled" );
- System.out.println( "privider:" +provider);
- }
- public void onProviderDisabled(Stringprovider){
- System.out.println( "onProviderDisabled" );
- System.out.println( "privider:" +provider);
- }
- };
- }
轉自:http://blog.csdn.net/tianjf0514/article/details/8295099
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
