2011-04-07 53 views
1

我想顯示我的當前位置的經度和緯度.. 爲此,而不是在Google中搜索,我搜索了SO。在獲取當前位置的Android中的問題

我只想顯示當前位置的經緯度。

見下面我的代碼:

public class LocationGetter extends Activity { 

@Override 

public void onCreate(Bundle savedInstanceState) 
{ 

super.onCreate(savedInstanceState); 

TextView tv = new TextView(this); 

LocationManager mlocManager = 
       (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

LocationListener mlocListener = new LocationManagerHelper(); 

mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 100,mlocListener); 

if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     tv.append("Latitude:- " + LocationManagerHelper.getLatitude() 
       + '\n'); 
     tv.append("Longitude:- " + LocationManagerHelper.getLongitude() 
       + '\n'); 

     Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude())); 

} else { 
    tv.setText("GPS is not turned on..."); 
} 

/** set the content view to the TextView */ 
setContentView(tv); 

} 

/* Class My Location Listener */ 

public static class LocationManagerHelper implements LocationListener { 

    private static double latitude; 
    private static double longitude; 

    @Override 
    public void onLocationChanged(Location loc) { 
     latitude = loc.getLatitude(); 
     longitude = loc.getLongitude(); 
     Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude)); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { } 

    @Override 
    public void onProviderEnabled(String provider) { } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    public static double getLatitude() { 
     return latitude; 
    } 

    public static double getLongitude() { 
     return longitude; 
    } 

} 

} 

我也清單文件添加權限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 

看到輸出我得到:

enter image description here

其中i我錯了嗎?我不明白,它是一個簡單的代碼,爲什麼它不工作?

+0

您是在模擬器上輸入「gpx」數據還是在設備上啓用了GPS? – Swaroop 2011-04-07 09:45:24

+0

我在模擬器上使用它。我也試過這個:telnet localhost 5554,然後geo fix 12 72 ..它不工作。我哪裏錯了? – 2011-04-07 09:47:26

+0

您是否嘗試過使用Eclipse ADT的DDMS仿真器控件?手動修復一個點? – Swaroop 2011-04-07 10:04:20

回答

2

我只是驗證你的代碼,並將其與這些變化的作品,你只需要在tv.append()呼叫轉移到onLocationChanged()方法是每次調用時,如果不使用回調,則u將獲得第一組值onl並且它只執行一次。

 public void onLocationChanged(Location loc) { 
      latitude = loc.getLatitude(); 
      longitude = loc.getLongitude(); 
      Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude)); 
      tv.append("Latitude:- " + LocationManagerHelper.getLatitude() 
        + '\n'); 
      tv.append("Longitude:- " + LocationManagerHelper.getLongitude() 
        + '\n'); 

      Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude())); 

     } 

,我已經在AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />  
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />  

使用這些權限可以看看這些和過濾掉那些你不感興趣的。我已經使用了下載。GPX文件從here

我測試過它在Android 2.2雖然,Location Updates working

+0

讓我試試這個。測試後會告訴你。我應該在手機中測試嗎? – 2011-04-07 10:43:26

+0

當我將所有tv.append調用移動到onLocationChanged時,它沒有顯示任何東西。 onLocationChanged沒有被調用。 – 2011-04-07 11:09:09

+0

您應該發送位置更新,以便onLocationChanged從DDMS Emulator控制面板調用。你可以使用模擬器或設備(啓用真正的GPS /模擬更新)。我在Android 2.2模擬器上測試過。 – Swaroop 2011-04-07 12:07:55

0

使用LocationManager

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
double longitude = location.getLongitude(); 
double latitude = location.getLatitude(); 

getLastKnownLocation()的調用不會阻塞 - 這意味着它會返回null如果沒有位置是當前可用 - 所以你可能想看看傳遞LocationListenerrequestLocationUpdates() method相反,它會給你異步更新您的位置。

private final LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     longitude = location.getLongitude(); 
     latitude = location.getLatitude(); 
    } 
} 

lm.requestLocationUpdates(LocationManager.GPS, 2000, 10, locationListener); 

如果您想使用GPS,您需要爲您的應用程序提供ACCESS_FINE_LOCATION permission

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

您可能還需要添加ACCESS_COARSE_LOCATION permission爲當GPS不可用,並選擇與您的getBestProvider() method位置提供。

+1

感謝您的回覆。但這是我用過的。看代碼。 – 2011-04-07 09:53:50

0

我認爲與模擬器,你不能得到GPS座標。如果您正在使用手機,請嘗試在建築物外面使用GPS。有時你不會得到建築物內的GPS座標。如果那時候你也失敗了,那麼我會發布我們成功的代碼。

下面的代碼剛纔我已經測試及其作品我..

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.widget.Toast; 

public class GetGPS extends Activity { 

String GPSPROVIDER = LocationManager.GPS_PROVIDER; 
private static final long MIN_GEOGRAPHIC_POOLING_TIME_PERIOD = 10000; 
private static final float MIN_GEOGRAPHIC_POOLING_DISTANCE = (float)5.0; 

public LocationManager gpsLocationManager; 

static Context context = null; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    context = this; 

    /*Get a listener for GPS*/ 
    LocationListener gpsLocationListener = null; 

    gpsLocationListener = new GpsLocationListener(this); 

    /*Start Location Service for GPS*/ 
    gpsLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    /*Register GPS listener with Location Manager*/ 
    gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
      MIN_GEOGRAPHIC_POOLING_TIME_PERIOD, 
      MIN_GEOGRAPHIC_POOLING_DISTANCE, gpsLocationListener); 

    boolean isavailable = gpsLocationManager.isProviderEnabled(GPSPROVIDER); 

    if(isavailable) { 

     Location loc = gpsLocationManager.getLastKnownLocation("gps"); 

     if(loc != null) { 
      double latitude = loc.getLatitude(); 
      double longitude = loc.getLongitude(); 

      Toast.makeText(GetGPS.this,"Longitude is "+longitude + " Latitude is "+latitude, Toast.LENGTH_LONG).show(); 

     } 
    } 

} 

public static class GpsLocationListener implements LocationListener { 


    public GpsLocationListener(Context context){ 

    } 

    public void onLocationChanged(Location loc) { 

     if (loc != null) { 

      double latitude = loc.getLatitude(); 
      double longitude = loc.getLongitude(); 

      Toast.makeText(context,"Longitude is "+longitude + " Latitude is "+latitude, Toast.LENGTH_LONG).show(); 

     } 

    }//End of onLocationChanged Method 

    @Override 
    public void onProviderDisabled(String provider) { 

    }//End of onProviderDisabled Method 

    @Override 
    public void onProviderEnabled(String provider) { 

    }//End of onProviderEnabled Method 

    @Override 
    public void onStatusChanged(String provider, int status, 
      Bundle extras) { 


    }//End of onStatusChanged Method 

}//End of GpsLocationListener class 
} 

我測試這款由設備從一個地方移動到另一個...

我希望這將有助於..

+0

在這裏看到帖子。關於在模擬器中測試GPS應用程序http://www.firstdroid.com/2010/04/29/android-development-using-gps-to-get-current-location-2/ – 2011-04-07 10:00:30

+0

我試過你所說的......它不是工作...... – 2011-04-07 10:11:49

+0

ü可以通過上面的代碼,我已發佈..它的工作對我來說。有一個聽衆,每10秒收聽GPS座標。 – uday 2011-04-07 12:07:05

2

您在Onlocationchanged了位置

public void onLocationChanged(Location loc) { 
    latitude = loc.getLatitude(); 
    longitude = loc.getLongitude(); 
    Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude)); 
    } 

所以lattitude和經度將只顯示當從電流的變化location.for檢查你提供了一些經緯度,並從DDMS中的模擬器控件發送,然後運行你的程序。確保它會顯示位置。

enter image description here

+0

如何從DDMS提供經緯度? – 2011-04-07 11:12:08

+0

當你點擊DDMS時,它會模擬器控制窗口。如果沒有,那麼你從窗口 - >顯示視圖中選擇它。在那裏你會找到位置控件。點擊手動標籤並輸入緯度和經度,然後點擊發送,然後運行你的程序 – adithi 2011-04-07 11:58:05

+0

是的,謝謝,它現在完成..從模擬器控制發送是好的..我會得到我的當前位置,如果我在我的手機安裝此應用程序? – 2011-04-07 12:00:26

1

如果您在設備運行這個程序,然後將其顯示經緯度0.0,直到我們改變我們的position.You必須從當前位置看到輸出移動至少10流量計。因爲沒有改變當前位置onLocationChange()方法不會觸發並且輸出將爲0.0