Pregunta

Estoy tratando de obtener la ubicación actual del usuario a través de la capacidad GPS,

Escribió una clase simple que implementa LocationListener

public class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
    }

    @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;
    }

}

Y desde una acción simple estoy accediendo a estos valores de longitud y latitud

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** create a TextView and write Hello World! */
    TextView tv = new TextView(this);

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

    LocationListener mlocListener = new LocationManagerHelper();

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');
    } else {
        tv.setText("GPS is not turned on...");
    }

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

Pero siempre devuelve 0.0 como resultado. No podría descubrir el problema.

¿Fue útil?

Solución

Las devoluciones de llamada de sus actualizaciones de ubicación no se pueden disparar hasta después de que devuelva OnCreate (). Si inicializa sus variables LAT/largas a los valores ficticios, probablemente verá que está imprimiendo esos valores.

Ponga un registro en su cambio de ontlocation para que pueda ver que se está disparando, luego lea un poco sobre cómo funcionan las aplicaciones de Android con respecto a las devoluciones de llamada y actualizar la interfaz de usuario.

También asegúrese de que su solicitud tenga permisos apropiados en su manifiesto.

Otros consejos

Las actualizaciones de la ubicación son de hecho asincrónico. Esto significa que la API no hace que su hilo de llamadas espere hasta que esté disponible una nueva ubicación; En su lugar, registra un objeto Observador con un método específico (llamar de vuelta) que se llama cada vez que se calcula una nueva ubicación.

En el API de Android UbicationManager, el observador es un LocationListener objeto, y la devolución de llamada principal para las actualizaciones de ubicación es OnlocationChanged ()

Aquí hay un diagrama que intenta explicar este punto (¡espero que esto ayude en lugar de confundirlo!)

Sequence diagram

Entonces de su código actual:

  • Declarar Mloclistener como miembro de su subclase de actividad
  • Agregar salidas de registro (líneas logCat) en su implementación de LocationListener
  • Mantenga el resto del código tal como está.
  • Agregue los permisos correctos en el manifiesto (Fingente es necesario para GPS) si aún no se hace.
  • Trate de conectar el teléfono a Internet y cerca de una ventana, para obtener una solución GPS bastante rápida (debe ser de ~ 30 años).

Luego inicie la aplicación y mira lo que sucede en el logCat. Verá que los cambios de estado y las actualizaciones de ubicación no son inmediatas después de la solicitud inicial, lo que explica por qué su TextView siempre se muestra (0.0,0.0).

Más: http://developer.android.com/guide/topics/location/obtaining-user-location.html

Después de obtener MLOCLISTENER, establezca los criterios como se muestra a continuación

String mlocProvider;
Criteria hdCrit = new Criteria();
hdCrit.setAccuracy(Criteria.ACCURACY_COARSE);
mlocProvider = mlocManager.getBestProvider(hdCrit, true);

y luego usa getlast conocido

tv.append("\n\nLocations (starting with last known):");
Location currentLocation = mlocManager.getLastKnownLocation(mlocProvider);

Asegúrate de tenerlos en tu manifiesto
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"

Si está utilizando el emulador: en la perspectiva DDMS, busque controles de ubicación en la pestaña Control del emulador. Luego use la pestaña Manual para establecer la longitud y la latitud y haga clic en Enviar: haga esto cuando su programa se ejecute, vea una llamada a OnlocationChanged. Es una buena idea tener un inicio de OnlocationChanged.

Por cierto, los parámetros en SolicLocationUpdates están configurados en "... 0,0 ..." - Drenará la batería - He visto el teléfono muerto en 6 - 8 horas - Cámbielo a "... 30000, 100 ... " - El primer parámetro en milisec y el otro está en metros.

Cuando lo revise en el emulador, le dará 0.0. Tienes que pasar las ubicaciones al emulador. Puede pasar esto desde C: Android-SDK_R06 Android-SDK-Windows Tools ddms.bat File.

En DDMS hay una pestaña llamada Controles del emulador. Desde allí puedes pasar las ubicaciones al emulador. prueba esto. Espero que funcione.

¿Cómo crear aplicación?

Obtener la ubicación actual coordenadas por acción (obtener ubicación) Lat/Long

Publique la ubicación en el servidor web que se mostrará en el mapa. (Envíe) el botón Borrar para borrar la ubicación anterior (ubicación de claro) o en (enviar) queda claro (0.0.0.0)

Obtener la ubicación GPS actual en Android http://developer.android.com/guide/topics/location/obtaining-user-location.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top