2011-07-15 19 views
5

Estoy tratando de hacer una aplicación simple en Android para obtener la ubicación actual usando el GPS o el proveedor de red (WIFI o torre) pero estoy enfrentando problemas mientras trato de hacerlo funcionar en el Android. No comenzará, me dio una excepción, no sé por qué.¿Cómo puedo obtener la ubicación actual en Android programáticamente?

Este es el código. Es tan simple, porque quiero probar conseguir la ubicación & tarde voy a añadir algunas características & funcionalidad ..

principal:

package com.GpsTesting; 

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 GPS_TestActivity extends Activity{ 
    /** Called when the activity is first created. */ 
    String location_text=""; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


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

    // Define a listener that responds to location updates 
     LocationListener locationListener = new LocationListener() { 

      public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location provider. 

       if (location != null) { 
        double lat = location.getLatitude(); 
        double lng = location.getLongitude(); 

        location_text= "latitude: "+lat+"longitude: "+lng; 

        Toast.makeText(getApplicationContext(), location_text, Toast.LENGTH_SHORT).show(); 

       } 
      } 

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

      public void onProviderEnabled(String provider) {} 

      public void onProviderDisabled(String provider) {} 
      }; 



     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener); 

    } 

} 

el manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.GpsTesting" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:permission="android.permission.ACCESS_FINE_LOCATION"> 
     <activity android:name=".GPS_TestActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

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


</manifest> 

es así, ¿ hay un problema en el código? Lo estoy haciendo usando un tutorial en línea (desde los desarrolladores de Android &).

Muchas gracias.

Notas Agregado:

cosa ** Realmente he weared. Intento ejecutar la aplicación usando el modo Eclipse (conectando mi dispositivo a través de USB & ejecutando la aplicación en el dispositivo en lugar de la aplicación) ... cuando lo intenté, ¡la aplicación funciona perfectamente sin problemas! mientras uso el método antiguo (enviando el archivo .apk a través del correo electrónico & y luego instalándolo desde el teléfono, ¡¡¡¡¡¡siempre me da la excepción !!) ¿alguien puede explicarme por qué sucede eso? Me estoy perdiendo de algo ?? ya que, soy conocido en el desarrollo de Android. entonces, me temo que me falta un punto ...

Estoy enviando a través del correo electrónico el archivo .apk que está en la carpeta bin (que está propósito de la prueba) ... Intenté con otra aplicación simple solo para asegurarme de que el archivo .apk que está disponible en la carpeta bin el derecho onw (para probar) o no, & funciona ... entonces, el archivo apk es bien ... pero ¿por qué para la aplicación de red no funciona mientras está en el eclipse? Gracias de antemano;) **

resolver;)

La solución para el problema i añadido un permiso antes en el manifiesto en la etiqueta de aplicación

androide: permiso = "androide .permission.ACCESS_FINE_LOCATION "

y fue duplicado porque ya se ha agregado a continuación (o porque está en el lugar equivocado). Así que lo eliminé & funciona correctamente.

Muchas gracias chicos

+0

Por favor, después del registro con el StackTrace, o al menos lo que nos dicen excepción se llega y dónde exactamente. – MByD

+0

¿Qué excepción obtienes? – jamapag

+1

Sí, acceder al GPS de Android puede ser molesto. ¿Sabes qué tipo de excepción estás recibiendo? Ejecute el depurador en Eclipse o use 'adb logcat' (adb se encuentra en el directorio platform-tools del SDK de Android). –

Respuesta

1

es probable que se echa en falta el permiso de Internet en el manifiesto

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
+0

No, trato de ponerlos ... pero el mismo problema todavía existe :( – Q8Y

+0

Gracias por el consejo ... el problema era del minafist;) – Q8Y

1

Creo que se puede leer y ver el contenido que se hizo disponible durante IO 2011 por Reito Meier.

Google IO 2011 de Meier (ver video, obtener diapositivas, obtener fragmentos de código ...):
http://blog.radioactiveyak.com/2011/05/android-protips-where-to-download.html

publicación de Reito Meier acerca de las aplicaciones basadas en la ubicación:
http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html
http://blog.radioactiveyak.com/2011/06/deep-dive-into-location-part-2-being.html

4

Antes que nada, verifico qué proveedores están habilitados. Algunos pueden estar deshabilitados en el dispositivo, algunos pueden estar deshabilitados en el manifiesto de la aplicación. Si hay algún proveedor disponible, inicio escuchas de ubicación y temporizador de tiempo de espera. Son 20 segundos en mi ejemplo, puede que no sea suficiente para el GPS, así que puedes agrandarlo. Si recibo una actualización del escucha de ubicación, uso el valor provisto. Detengo a los oyentes y el temporizador. Si no obtengo ninguna actualización y el tiempo transcurre, tengo que usar los últimos valores conocidos. Obtengo los últimos valores conocidos de los proveedores disponibles y elijo los más recientes.

   MyLocation myLocation = new MyLocation(); 

    private void locationClick() { 
    myLocation.getLocation(this, locationResult); 
    } 

public LocationResult locationResult = new LocationResult() { 

    @Override 
    public void gotLocation(final Location location) { 
     //Got the location! 
    } 
}; 

Y aquí está la clase MyLocation:

import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class MyLocation { 
Timer timer1; 
LocationManager lm; 
LocationResult locationResult; 
boolean gps_enabled=false; 
boolean network_enabled=false; 

public boolean getLocation(Context context, LocationResult result) 
{ 
    //I use LocationResult callback class to pass location value from MyLocation to user code. 
    locationResult=result; 
    if(lm==null) 
     lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    //exceptions will be thrown if provider is not permitted. 
    try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
    try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} 

    //don't start listeners if no provider is enabled 
    if(!gps_enabled && !network_enabled) 
     return false; 

    if(gps_enabled) 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
    if(network_enabled) 
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
    timer1=new Timer(); 
    timer1.schedule(new GetLastLocation(), 20000); 
    return true; 
} 

LocationListener locationListenerGps = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     timer1.cancel(); 
     locationResult.gotLocation(location); 
     lm.removeUpdates(this); 
     lm.removeUpdates(locationListenerNetwork); 
    } 
    public void onProviderDisabled(String provider) {} 
    public void onProviderEnabled(String provider) {} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; 

LocationListener locationListenerNetwork = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     timer1.cancel(); 
     locationResult.gotLocation(location); 
     lm.removeUpdates(this); 
     lm.removeUpdates(locationListenerGps); 
    } 
    public void onProviderDisabled(String provider) {} 
    public void onProviderEnabled(String provider) {} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; 

class GetLastLocation extends TimerTask { 
    @Override 
    public void run() { 
     lm.removeUpdates(locationListenerGps); 
     lm.removeUpdates(locationListenerNetwork); 

     Location net_loc=null, gps_loc=null; 
     if(gps_enabled) 
      gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if(network_enabled) 
      net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

     //if there are both values use the latest one 
     if(gps_loc!=null && net_loc!=null){ 
      if(gps_loc.getTime()>net_loc.getTime()) 
       locationResult.gotLocation(gps_loc); 
      else 
       locationResult.gotLocation(net_loc); 
      return; 
     } 

     if(gps_loc!=null){ 
      locationResult.gotLocation(gps_loc); 
      return; 
     } 
     if(net_loc!=null){ 
      locationResult.gotLocation(net_loc); 
      return; 
     } 
     locationResult.gotLocation(null); 
    } 
} 

public static abstract class LocationResult{ 
    public abstract void gotLocation(Location location); 
} 
} 


<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
+0

por favor revisa mi nueva nota en la publicación principal;) gracias – Q8Y

+0

Tu código o lo obtuviste de http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-in-a ? – DannyThunder

Cuestiones relacionadas