Pergunta

Eu estou trabalhando em um widget que irá obter a localização GPS atual e passar esse valor para página PHP remoto para obter as informações e exibi-lo no Widget. Isso é o que estou tentando fazer.

Estou enfrentando problema durante a implementação Localização Listener para appWidget. Ele não está atualizando com a localização atual e ele está mostrando a inicial Widget i "Loading Widget" (Aqui eu coloquei este texto)

Podemos implementar Localização Listener para AppWidgetProvider?
ou
você pode me sugerir a solução possível para obter localização GPS na App Widget?

Eu coloquei todas as permissões necessárias no arquivo de manifesto.
Aqui está o meu trecho 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;
    }

}
}

Obrigado antecipadamente ...

No que diz respeito, Raghavendra K.

Foi útil?

Solução

Você está tendo esse problema no emulador ou em um dispositivo? Se no emulador, certifique-se de usar DDMS para definir uma localização GPS. Mas a coisa mais fácil de fazer poderia ser a de executar seu código em um aparelho para ver se você começa GPS atualiza dessa forma.

Outras dicas

O problema que vejo é que você está tentando verificar curLocation em onStart () logo após chamar requestLocationUpdates (). LocationManager.requestLocationUpdates () é assíncrona, o que significa que o seu LocationListener não se ligou de volta até depois onStart () retornou. Ter o seu update LocationListener a interface do usuário depois que ele recebe a localização, não tente fazê-lo em onStart.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top