2011-04-07 24 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