Pregunta

Estoy trabajando en un Widget que obtendrá la ubicación GPS actual y pasará este valor a la página remota de PHP para obtener la Información y mostrarla en el Widget. Esto es lo que estoy tratando de hacer.

Tengo un problema al implementar Location Listener para appWidget. No se está actualizando con la ubicación actual y muestra el widget inicial, es decir, " Widget de carga " (Aquí pongo este texto)

¿Podemos implementar Location Listener para AppWidgetProvider?
  O
   ¿Puede sugerirme la posible solución para obtener la ubicación GPS en el widget de la aplicación?

Coloqué todos los permisos necesarios en el archivo Manifest.
Aquí está mi fragmento de código:

public class test extends AppWidgetProvider {
static LocationManager locMan;
static Location curLocation;
static Boolean locationChanged;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    // To prevent any ANR timeouts, we perform the update in a service
    context.startService(new Intent(context, UpdateService.class));
}

public static class UpdateService extends Service {
    // GPS Listener Class
    LocationListener gpsListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Log.w("GPS", "Started");
            if (curLocation == null) {
                curLocation = location;
                locationChanged = true;
            }

            if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude())
                locationChanged = false;
            else
                locationChanged = true;

            curLocation = location;

            if (locationChanged) 
                locMan.removeUpdates(gpsListener);

        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {
            // Log.w("GPS", "Location changed", null);
        }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            if (status == 0)// UnAvailable
            {

            } else if (status == 1)// Trying to Connect
            {

            } else if (status == 2) {// Available

            }
        }

    };

    // In service start method, I am registering for GPS Updates
    @Override
    public void onStart(Intent intent, int startId) {

        locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
        } else {
            this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
        }

        if (curLocation != null) {
            double lat = curLocation.getLatitude();
            double lng = curLocation.getLongitude();
            Toast.makeText(getBaseContext(),"Lat : " + String.valueOf(lat) + "\n Long : "+ String.valueOf(lng), Toast.LENGTH_LONG).show();

        }
        // Build the widget update for today
        RemoteViews updateViews = buildUpdate(this);

        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this,InKakinadaWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);

    }

    public RemoteViews buildUpdate(Context context) {
        // Here I am updating the remoteview
        return updateViews;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't need to bind to this service
        return null;
    }

}
}

Gracias de antemano ...

Con Saludos, Raghavendra K.

¿Fue útil?

Solución

¿Tiene este problema en el emulador o en un dispositivo? Si está en el emulador, asegúrese de usar DDMS para establecer una ubicación GPS. Pero lo más fácil que puede hacer es ejecutar su código en un dispositivo para ver si obtiene actualizaciones de GPS de esa manera.

Otros consejos

El problema que veo es que está intentando verificar curLocation en onStart () justo después de llamar a requestLocationUpdates (). LocationManager.requestLocationUpdates () es asíncrono, lo que significa que no se volverá a llamar a LocationListener hasta que onStart () haya regresado. Haga que su LocationListener actualice la IU después de recibir la ubicación, no intente hacerlo en onStart.

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