Android_guides: Um bom exemplo de serviço de segundo plano obtendo atualizações de localização

Criado em 29 set. 2016  ·  71Comentários  ·  Fonte: codepath/android_guides

Por favor, eu realmente preciso de ajuda.

Estou enfrentando um problema aqui. É impossível encontrar UM BOM EXEMPLO de como criar um serviço que deve ser executado em segundo plano e receber atualizações de localização. Além disso, todos os exemplos em developer.android.com são terríveis, qualquer um deles realmente funciona.

O objetivo do meu aplicativo é obter atualizações de localização em segundo plano, algo que parece tão simples, mas infelizmente não consegui encontrar nenhum bom exemplo de como fazer isso.

Comentários muito úteis

@ veda2vratha muito obrigado, tentei esses exemplos que você me enviou. Na verdade, eles são os mesmos.

Testando, pude ver neste exemplo que ele é executado a cada segundo, solicitando uma localização muito precisa. Então, eu mudo para a cada 20 segundos e 500m para a distância, o que me dá um serviço rodando a cada 20 segundos.

Então percebo que posso estar cometendo um erro sobre o que procuro. O que quero dizer é que meu aplicativo não precisa de uma localização muito precisa, além disso, ele não precisa ser executado a cada segundo ou minuto. Meu aplicativo precisa apenas coletar a posição de localização relevante.

Então, o que eu preciso é de um coletor de localização passivo. Disseram-me que o sistema operacional Android pode transmitir para qualquer aplicativo em mudanças de posição de localização no modo passivo. Isso é ótimo porque reduz o uso da bateria. Portanto, meu local de serviço (local do ouvinte) será acionado apenas quando o sistema operacional Android tiver sido solicitado para localização por outro aplicativo, por exemplo, o Google Maps.

Depois de algumas horas pesquisando profundamente os provedores de localização, eu o encontrei, que se chama LocationManager.PASSIVE_PROVIDER. Isso é muito legal, parece exatamente o que eu preciso.

Aqui, vou compartilhar como está o meu serviço agora.

Agora, gostaria de fazer uma pergunta, por que algum desenvolvedor e até mesmo no Android Training NÃO fala sobre LocationManager.PASSIVE_PROVIDER? Qual é o problema de usá-lo?

Eu gostaria de dizer tank you @ veda2vratha novamente 👍

Meu serviço de localização:

package com.example.roberto.trainingbackgroundservice;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

/**
 * Created by roberto on 9/29/16.
 */

public class MyLocationService extends Service {
    private static final String TAG = "MyLocationService";
    private LocationManager mLocationManager = null;
    private static final int LOCATION_INTERVAL = 1000;
    private static final float LOCATION_DISTANCE = 10f;

    private class LocationListener implements android.location.LocationListener {
        Location mLastLocation;

        public LocationListener(String provider) {
            Log.e(TAG, "LocationListener " + provider);
            mLastLocation = new Location(provider);
        }

        <strong i="16">@Override</strong>
        public void onLocationChanged(Location location) {
            Log.e(TAG, "onLocationChanged: " + location);
            mLastLocation.set(location);
        }

        <strong i="17">@Override</strong>
        public void onProviderDisabled(String provider) {
            Log.e(TAG, "onProviderDisabled: " + provider);
        }

        <strong i="18">@Override</strong>
        public void onProviderEnabled(String provider) {
            Log.e(TAG, "onProviderEnabled: " + provider);
        }

        <strong i="19">@Override</strong>
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.e(TAG, "onStatusChanged: " + provider);
        }
    }

    /*
    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.GPS_PROVIDER),
            new LocationListener(LocationManager.NETWORK_PROVIDER)
    };
    */

    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.PASSIVE_PROVIDER)
    };

    <strong i="20">@Override</strong>
    public IBinder onBind(Intent arg0) {
        return null;
    }

    <strong i="21">@Override</strong>
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    <strong i="22">@Override</strong>
    public void onCreate() {

        Log.e(TAG, "onCreate");

        initializeLocationManager();

        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.PASSIVE_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[0]
            );
        } catch (java.lang.SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "network provider does not exist, " + ex.getMessage());
        }

        /*try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[1]
            );
        } catch (java.lang.SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "gps provider does not exist " + ex.getMessage());
        }*/
    }

    <strong i="23">@Override</strong>
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        super.onDestroy();
        if (mLocationManager != null) {
            for (int i = 0; i < mLocationListeners.length; i++) {
                try {
                    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    mLocationManager.removeUpdates(mLocationListeners[i]);
                } catch (Exception ex) {
                    Log.i(TAG, "fail to remove location listener, ignore", ex);
                }
            }
        }
    }

    private void initializeLocationManager() {
        Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: "+ LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE);
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        }
    }
}

Todos 71 comentários

@ veda2vratha muito obrigado, tentei esses exemplos que você me enviou. Na verdade, eles são os mesmos.

Testando, pude ver neste exemplo que ele é executado a cada segundo, solicitando uma localização muito precisa. Então, eu mudo para a cada 20 segundos e 500m para a distância, o que me dá um serviço rodando a cada 20 segundos.

Então percebo que posso estar cometendo um erro sobre o que procuro. O que quero dizer é que meu aplicativo não precisa de uma localização muito precisa, além disso, ele não precisa ser executado a cada segundo ou minuto. Meu aplicativo precisa apenas coletar a posição de localização relevante.

Então, o que eu preciso é de um coletor de localização passivo. Disseram-me que o sistema operacional Android pode transmitir para qualquer aplicativo em mudanças de posição de localização no modo passivo. Isso é ótimo porque reduz o uso da bateria. Portanto, meu local de serviço (local do ouvinte) será acionado apenas quando o sistema operacional Android tiver sido solicitado para localização por outro aplicativo, por exemplo, o Google Maps.

Depois de algumas horas pesquisando profundamente os provedores de localização, eu o encontrei, que se chama LocationManager.PASSIVE_PROVIDER. Isso é muito legal, parece exatamente o que eu preciso.

Aqui, vou compartilhar como está o meu serviço agora.

Agora, gostaria de fazer uma pergunta, por que algum desenvolvedor e até mesmo no Android Training NÃO fala sobre LocationManager.PASSIVE_PROVIDER? Qual é o problema de usá-lo?

Eu gostaria de dizer tank you @ veda2vratha novamente 👍

Meu serviço de localização:

package com.example.roberto.trainingbackgroundservice;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

/**
 * Created by roberto on 9/29/16.
 */

public class MyLocationService extends Service {
    private static final String TAG = "MyLocationService";
    private LocationManager mLocationManager = null;
    private static final int LOCATION_INTERVAL = 1000;
    private static final float LOCATION_DISTANCE = 10f;

    private class LocationListener implements android.location.LocationListener {
        Location mLastLocation;

        public LocationListener(String provider) {
            Log.e(TAG, "LocationListener " + provider);
            mLastLocation = new Location(provider);
        }

        <strong i="16">@Override</strong>
        public void onLocationChanged(Location location) {
            Log.e(TAG, "onLocationChanged: " + location);
            mLastLocation.set(location);
        }

        <strong i="17">@Override</strong>
        public void onProviderDisabled(String provider) {
            Log.e(TAG, "onProviderDisabled: " + provider);
        }

        <strong i="18">@Override</strong>
        public void onProviderEnabled(String provider) {
            Log.e(TAG, "onProviderEnabled: " + provider);
        }

        <strong i="19">@Override</strong>
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.e(TAG, "onStatusChanged: " + provider);
        }
    }

    /*
    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.GPS_PROVIDER),
            new LocationListener(LocationManager.NETWORK_PROVIDER)
    };
    */

    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.PASSIVE_PROVIDER)
    };

    <strong i="20">@Override</strong>
    public IBinder onBind(Intent arg0) {
        return null;
    }

    <strong i="21">@Override</strong>
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    <strong i="22">@Override</strong>
    public void onCreate() {

        Log.e(TAG, "onCreate");

        initializeLocationManager();

        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.PASSIVE_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[0]
            );
        } catch (java.lang.SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "network provider does not exist, " + ex.getMessage());
        }

        /*try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    LOCATION_INTERVAL,
                    LOCATION_DISTANCE,
                    mLocationListeners[1]
            );
        } catch (java.lang.SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "gps provider does not exist " + ex.getMessage());
        }*/
    }

    <strong i="23">@Override</strong>
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        super.onDestroy();
        if (mLocationManager != null) {
            for (int i = 0; i < mLocationListeners.length; i++) {
                try {
                    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    mLocationManager.removeUpdates(mLocationListeners[i]);
                } catch (Exception ex) {
                    Log.i(TAG, "fail to remove location listener, ignore", ex);
                }
            }
        }
    }

    private void initializeLocationManager() {
        Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: "+ LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE);
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        }
    }
}

Além disso, fiquei confuso com esse problema nos dias de hoje e descobri que alguns dispositivos móveis (talvez a versão do Android causou) estão ok, alguns não estão funcionando, não é possível obter o retorno de chamada de local (local alterado) em segundo plano. Tentei seu serviço escrito , não funcionou depois que o aplicativo mudou para segundo plano

Como posso chamar no MainActivity?
Você pode por favor me ajudar

startservice (new Intent (this, MyLocationService .class));
@ vani-chikaraddi

Você pode experimentar a API de locais do Google ...

Quero exibir a longitude e a latitude, como posso fazer isso. Tentei o seguinte código, mas obtive uma tela branca

@Sobrepor
public void onLocationChanged (Location location) {
Log.e (TAG, "onLocationChanged:" + localização);
mLastLocation.set (localização);
longitude = location.getLongitude ();
latitude = location.getLatitude ();
Toast.makeText (MyLocationService.this, longitude + "sim" + latitude + "", Toast.LENGTH_LONG) .show ();
}

Também usei o código do SO vinculado acima, mas como passo o local encontrado de volta para meu aplicativo, para que possa atualizar as informações de local no Firebase? Obrigado!

"mas como faço para passar o local encontrado de volta para o meu aplicativo ,?" Eu criei um aplicativo de fundo onde o usuário determina com que frequência (em minutos) os serviços de localização devem ser ativados. Em seguida, ele envia informações para SMS, e-mail ou ambos. A maneira mais fácil (que eu uso) de transferir dados dentro de um aplicativo é SharedPreferences. Parece tão fácil que fiquei cético quanto ao seu uso - mas nunca me falhou.

Obrigado, descobri que o envio de volta em uma transmissão.

@ AndyCr15 , definitivamente uma das maneiras mais fáceis de fazer isso é enviar os dados coletados por meio de mensagem de broadcast. :-)

Realmente util

muito útil. Obrigado por compartilhar.

Olá

Estou desenvolvendo um aplicativo e há um cenário em que tenho que enviar a localização do usuário no servidor a cada 15 minutos, tudo está funcionando, mas às vezes a localização atual está incorreta.

Preciso de ajuda para obter a localização exata atual. Eu criei o GPS Tracker - usando o provedor de GPS e o provedor de rede Agora o problema é

  • Preciso da localização do GPS, mas quando removo o provedor de rede e uso o provedor GPS apenas, Latitude e longitude atuais são 0,0 na versão Noughat e Marshmallow.
  • Se eu usar o GPS e a rede, ele retornará errado em algum momento.

Sugira o que devo implementar para obter uma localização atual e precisa no aplicativo Android.

Você pode usar

mGoogleApiClient = new GoogleApiClient.Builder (este)
.addConnectionCallbacks (this)
.addOnConnectionFailedListener (this)
.addApi (LocationServices.API)
.construir();
e quando está conectado

Experimente {
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation (mGoogleApiClient);
if (mLastLocation! = null) {
lat = mLastLocation.getLatitude ();
longi = mLastLocation.getLongitude ();
} outro {
Toast.makeText (getApplicationContext (), "Não foi possível obter a verificação de localização do GPS LIGADO", Toast.LENGTH_LONG) .show ();
showSettingsAlert ();
}
} catch (Exceção e) {
e.printStackTrace ();
}

@RaziaSandhu Olá, obrigado pela sua resposta.
Preciso de localização sem os serviços do Google Play. Este aplicativo é para dispositivos fictícios para fins de segurança. Portanto, não há loja de jogos e serviços de jogos.

Oi,

Estou trabalhando no Gps para abrir os detalhes do enredo se os detalhes do enredo (lat, long) corresponderem, abra os detalhes do enredo, caso contrário, mostrará uma mensagem e funcionará por 5 parcelas depois disso se ele não estiver naquele enredo e o enredo estiver opend.
Em outro caso, quando eu reinicio o dispositivo novamente, ele funciona bem.
esse é o problema que estou enfrentando qualquer um pode me ajudar rápido .. tenho apenas um dia para apresentar este trabalho.

esta é a minha classe de serviço de localização, amostra de código
booleano gpsProviderEnabled = locationManager.isProviderEnabled (LocationManager.GPS_PROVIDER);
boolean networkProviderEnabled = locationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER);

        if (gpsProviderEnabled || networkProviderEnabled) {
            if (networkProviderEnabled) {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_UPDATE_TIME, MIN_UPDATE_DISTANCE, this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    providerType = "network";
                    Log.d(LOG_TAG, "network lbs provider:" + (location == null ? "null" : String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude())));
                    updateLocation(location);
                }
            }

            if (gpsProviderEnabled && location == null) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_UPDATE_TIME, MIN_UPDATE_DISTANCE, this);
                if (locationManager != null) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        // TODO: Consider calling
                        //    ActivityCompat#requestPermissions
                        // here to request the missing permissions, and then overriding
                        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                        //                                          int[] grantResults)
                        // to handle the case where the user grants the permission. See the documentation
                        // for ActivityCompat#requestPermissions for more details.
                        return;
                    }
                    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    providerType = "gps";
                    Log.d(LOG_TAG, "gps lbs provider:" + (location == null ? "null" : String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude())));
                    updateLocation(location);
                }
            }
        }

Isso é exatamente o que eu estava procurando, obrigado. Estou construindo um rastreador GPS personalizado, traçando meu caminho conforme minha localização muda e traçando um gráfico altitude-tempo paralelamente. Isso cria muita carga de trabalho no thread de IU principal e ele estava pulando quadros. Isso reduzirá uma sobrecarga considerável.

@betorobson Esta é a melhor maneira de obter os dados de localização periódicos. Mas eu me pergunto como posso localizar dados para o servidor. Sou iniciante, alguem pode ajudar?

@betorobson e @ veda2vratha Muito obrigado. Eu estava procurando por isso em todos os lugares. finalmente recebi a resposta de você.

@ Veer50 sou iniciante. Você pode me informar como posso obter a longitude e a latitude desse serviço em outra atividade? e como posso enviar este local para o servidor periodicamente? uma pequena explicação vai me ajudar muito. Desde já, obrigado.

@ toton6868 Não tenho certeza se funcionará neste caso, mas sempre que quero passar dados entre atividades, uso injeção de dependência, que é realizada por Dagger. Você pode injetar a instância desta classe em outra classe e obter acesso ao local variável de onde você pode buscar longitude e latitude (Leia sobre Dagger ..). Como também sou iniciante, não sei como enviar detalhes de localização para o servidor periodicamente.

Estou muito feliz em ajudar outras pessoas com meu código de snippet.
@ toton6868 , você tentou um simples?
Aqui está um exemplo muito simples e direto que acredito que pode ajudá-lo: https://developer.android.com/reference/android/os/AsyncTask.html

@betorobson Obrigado pela resposta. Eu sou conhecido por assíncrono de Tarefa, mas eu quero saber realmente como recuperar Longitude e Latitude em outra atividade.

@ veda2vratha , @betorobson

Olá e obrigado! está funcionando muito bem!

Eu tenho uma pergunta e poste aqui porque eu explorei a internet desde a solução.

Deixe-me explicar:

Tive que enviar minha localização para o nosso servidor (API REST com Express) com um Simply GET + appId (gerar ID exclusivo) + lat + long.
Para isso, tive que recuperar meu appId e meu token para minha solicitação, armazená-lo em minhas preferências de compartilhamento.

eu usei
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (this);

Eu vi muitas respostas sobre contexto em serviços e já testei todas as soluções, tentei no onCreate / onLocationChanged / onStartCommand mas não reconheci meu Token ou appId.

Há uma solução? desculpe, sou da web (html / css / js / php) e sou juste para começar a aprender Java
O ciclo de vida é difícil agora

Tente isto,
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (getApplicationContext ());
ou tente usar o nome de sharePreference onde você o armazenou,
SharedPreferences.getSharedPreferences ("NAME_HERE", Context.MODE_PRIVATE);

OnLocationChange não está em execução ...

Sobre o assunto, 3 boas recomendações baseadas em minha experiência:

  • Use PARTIAL_WAKELOCK para obter atualizações ou fazer a mesma ação na mesma taxa quando o dispositivo está com a tela desligada e em espera.
  • O melhor serviço para esse caso é o Serviço de primeiro plano . Não será eliminado pelo sistema, é o servidor de maior prioridade. Mas você deve mostrar o widget de notificação.
  • Implemente um singleton de GPS ou lógica semelhante com contexto de serviço ou aplicativo. Não confie em nenhuma atividade ou fragmento para evitar o ciclo de vida dos componentes .

@AroundPixels , O objetivo da minha pergunta neste tópico é o oposto da sua sugestão.
É muito comum ver a implementação de atualização de localização em execução no Foreground Service, no entanto, minha preferência aqui é aquele ouvinte de aplicativo para essas atualizações de localização em execução no modo passivo, o que significa menos uso de CPU e bateria.

Para quem procura um serviço em primeiro plano NÃO é o caso.

Esse problema foi resolvido pela seguinte solução:
https://github.com/codepath/android_guides/issues/220#issuecomment -250756857

Olá, @betorobson . Só estou compartilhando minha experiência sobre serviços de localização, porque fiz vários com enormes requisitos de precisão. Se você precisar de precisão, precisará de wake locks. Testei-os em centenas de dispositivos em modo de produção e, como você deve saber, cada dispositivo é diferente quando a tela é desligada. Muitas surpresas Android.

De qualquer forma, as diferenças entre o Serviço e o Serviço em primeiro plano são mínimas: widget e nível de prioridade. A implementação é a mesma, portanto, acho que meus conselhos podem ser úteis para alguém que entende esse tópico e precisa de um serviço de localização um pouco diferente do seu.

Se você ficou ofendido com minha postagem, sinto muito por você.

Está tudo bem @AroundPixels , não me ofendi.
Minha preocupação é manter a mentalidade deste tópico sobre o serviço de localização no modo passivo.

Olá @betorobson ,

Verifiquei seu exemplo acima para obter a latitude e longitude por meio do serviço.

Você pode me informar como obter a latitude e longitude quando o dispositivo móvel está no estado offline (ou seja, quando não há conectividade de dados da Internet e conectividade Wifi), apenas o GPS está habilitado. Conseguiremos buscar a latitude e a longitude.

@sairamandroid , o sistema operacional cuidará disso para você, o que significa que você não deve fazer nada. O que posso dizer é que, por baixo do capô, o APP do Android solicita / escuta as mudanças de localização e o sistema operacional Android vai pegá-lo para você usando o que está disponível no momento.

No meu exemplo. não está solicitando, apenas ouvindo mudanças significativas de localização. Eu tentei por 3 meses, coletando dados de localização, salvando dados do usuário e exibindo em um mapa. O resultado foi impressionante. Dirigindo todos os finais de semana para a praia, a 120km de distância de minha casa, ele mostra minha posição histórica incluindo lugares que não têm rede móvel ou wi-fi.

Vou compartilhar meu projeto de demonstração para todos aqui em alguns dias, parece que isso vai ajudar mais do que apenas um trecho de código.

Olá @betorobson ,

Obrigado pela resposta.

Eu tenho duas perguntas:

  1. Você estava mencionando como solicitar / ouvir mudanças de localização e o Android irá agarrar e fornecer. Você pode compartilhar um código para isso. Para que eu possa verificar essa funcionalidade.

  2. Também tenho outra consulta, ou seja, se chamarmos esta classe de serviço MyLocationService uma vez, ela continuará em execução em segundo plano para buscar a latitude e longitude atuais. (ou seja, o serviço estará em execução constantemente ou precisamos invocá-lo em um determinado intervalo para obter a latitude e a longitude.)

@sairamandroid
Aqui está:

  1. Se você deseja solicitar a localização por exemplo, crie um botão e toda vez que o usuário do seu aplicativo solicitar a localização atual, segue um exemplo para ele. https://github.com/codepath/android_guides/wiki/Retrieving-Location-with-LocationServices-API

  2. Na verdade, ele funcionará em segundo plano para sempre e a parte legal é que não vai consumir sua bateria porque está apenas ouvindo as mudanças de localização no modo passivo. Aqui está o trecho de código. https://github.com/codepath/android_guides/issues/220#issuecomment -250756857

Olá @betorobson ,

Portanto, no trecho de código que você compartilhou, pela primeira vez, se registrarmos o ouvinte de localização, sempre que houver alteração de localização, onLocationChanged será chamado diretamente e podemos obter as localizações atualizadas?

Confirme o fluxo, pois esse processo está sendo executado em segundo plano. Preciso de clareza em relação ao fluxo.

Basicamente, meu requisito é que um serviço seja executado em segundo plano constantemente e busque o local sem a intervenção do usuário.

@sairamandroid , com certeza ele irá rodar em background, uma vez que o aplicativo inicie, o serviço em background começará ao mesmo tempo ouvindo as mudanças de localização. Este código de snippet atenderá exatamente aos seus requisitos.

@betorobson ,

Obrigada.

como posso obter latitude e longitude de outra atividade ..

B

Oi,

Ouvinte de alteração de localização de API do Google usado

Em 20 de abril de 2018, 19h35, Zain [email protected] escreveu:

como posso obter latitude e longitude de outra atividade ..

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/codepath/android_guides/issues/220#issuecomment-383116285 ou ignore o tópico https://github.com/notifications/unsubscribe-auth/ADn8Iu2jtvLSPemZA- AiKu5Lqu_Hox - ks5tqfJHgaJpZM4KKc6K .

obrigado veda2vrath!
foi muito útil

@betorobson

e como você mostra os valores de latitude e longitude na MainActivity consumindo o serviço, o código que você forneceu, e sabendo qual seria a forma mais correta de estar enviando as informações para um servidor para mostrar em plataforma web, novidade em esta ajuda

Execute o Gps como serviço de segundo plano e envie as coordenadas para o servidor web (PHP)

Não obtendo informações de atualização de localização, mesmo quando a localização muda ...

Alguma sugestão? Usando exatamente o seu código.

Olá pessoal,

Tenho algumas dúvidas sobre rastreamento de localização e serviços em segundo plano como (background / foreground / firebasejobdispatcher / jobshedular / workmanager).

Atualmente, meu aplicativo está voltado para a versão 28 do Android. E estou testando no Android 8.0 agora. O código acima está funcionando perfeitamente na versão Android pré e pós-O. Mas obter a localização a cada 1 minuto.

Estou criando serviço de primeiro plano, mas alguns dispositivos como MI que interrompem esse serviço de primeiro plano. E a maneira correta de obter locais ou o serviço será executado em segundo plano?

tempo periódico do jobshedular / workmanager que não seja inferior a 15 min.

Peça a alguém que esteja trabalhando para enfrentar o mesmo problema e resolvê-lo, por favor, me oriente.

Obrigado

Alguém pode me dizer como armazenar esse local no banco de dados MySql usando Rest API

Alguém pode me dizer como armazenar esse local no banco de dados MySql usando Rest API

@saadmohammed Não sei se isso está correto ou não, mas atualmente, estamos criando um geoJson para o parâmetro de localização. E envie este geoJson para o servidor usando API.

Você pode armazenar este geoJson em seu banco de dados MySQL.

Como posso chamar no MainActivity?
Você pode por favor me ajudar

Intent startLocationService = new Intent (MainActivity.this, MyLocationService.class);
startService (startLocationService);

Certifique-se de declarar o serviço em androidmanifest.xml

Verifique o aplicativo de exemplo usando a versão mais recente do serviço de aumento de localização FusedLocationProviderClient link do tutorial https://www.freakyjolly.com/android-background-geolocation-service-without-any-kill/

Como o android Oreo acima do limite da localização do serviço em segundo plano, nenhuma das opções acima funciona. tentei amostra do google (https://github.com/googlecodelabs/background-location-updates-android-o/blob/af7660cfb91d114f330818e2033ca0175f11e07d/BackgroundLocationUpdates/app/src/main/AndroidManifest.xml) também não funciona para serviço de transmissão e intentent . Este é um exemplo de código que fiz

Na atividade principal: -
private PendingIntent getPendingIntent() { Intent intent = new Intent(getActivity(), LocationUpdatesBroadcastReceiver.class); intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES); return PendingIntent.getBroadcast(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); }
Executando o serviço / transmissão:
`FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient (getActivity ());
mLocationRequest = novo LocationRequest ();

    mLocationRequest.setInterval(UPDATE_INTERVAL);

    // Sets the fastest rate for active location updates. This interval is exact, and your
    // application will never receive updates faster than this value.
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

mFusedLocationClient.requestLocationUpdates (mLocationRequest, getPendingIntent ()); `

Meu BroadCast:

LocationUpdatesBroadcastReceiver extends BroadcastReceiver{ public static final String ACTION_PROCESS_UPDATES = "<idpackage>.action" + ".PROCESS_UPDATES"; private Location lstart = null; private Location lEnd = null; private Location mCurrentLocation; private double speed = 0.0, distance_accumalative = 0.0; private String cumulativeDistance; private ClientInterface client; private PersonModel personModel; private SessionManager sessionManager;

<strong i="18">@Override</strong>
public void onReceive(Context context, Intent intent) {
    if (intent != null) {
        sessionManager = new SessionManager(context);
        personModel = sessionManager.getDriver();

        final String action = intent.getAction();

        if (ACTION_PROCESS_UPDATES.equals(action)) {
            LocationResult result = LocationResult.extractResult(intent);
            if (result != null) {
                List<Location> locations = result.getLocations();

                for (Location b: result.getLocations()){
                    mCurrentLocation = b;

                    if (lstart == null) {
                        lstart = mCurrentLocation;
                        lEnd = mCurrentLocation;
                    } else {
                        lEnd = mCurrentLocation;
                    }

                    speed = ((double)b.getSpeed() * 18 /5);
                }

                //if speed more than zero update location
                updateLocation();

                LocationResultHelper locationResultHelper = new LocationResultHelper(
                        context, locations);
                // Save the location data to SharedPreferences.
                locationResultHelper.saveResults();
                // Show notification with the location data.
                locationResultHelper.showNotification();
                //Log.i(TAG, LocationResultHelper.getSavedLocationResult(context));
            }
        }
    }
}`

Alguém sabe como executar o serviço de localização em background para oreo acima.

@ hafiz013 você não pode fazer isso em segundo plano. Você precisa criar um intent e executar como uma notificação persistente.
Mova seu código para um intent com notificação persistente e funcionará perfeitamente

@ hafiz013 você não pode fazer isso em segundo plano. Você precisa criar um intent e executar como uma notificação persistente.
Mova seu código para um intent com notificação persistente e funcionará perfeitamente

Sim, eu fiz como mover para obter notificação pendente, mas alguns whore só funcionam em 10 minutos, em seguida, ele foi e não ligou mais. Para sua informação, quando eu verifico o resultado, o Android 7 mostrará a notificação acima enquanto faz a intenção getpending, enquanto o Android 8 e 9 não mostra a notificação acima.

Obrigado, descobri que o envio de volta em uma transmissão.

você pode me dizer como vai que estou realmente preso aqui e não sei como fazer isso com dispositivos Pie.
Obrigado

Obrigado, descobri que o envio de volta em uma transmissão.

você pode me dizer como vai que estou realmente preso aqui e não sei como fazer isso com dispositivos Pie.
Obrigado

Você está tentando usar o modo passivo ou a localização geográfica de alta precisão?

Primeiro você precisa da classe LocationUpdatesBroadcastReceiver extends BroadcastReceiver. Em seguida, transmissão interna:

`public static final String ACTION_PROCESS_UPDATES =".action "+
".PROCESS_UPDATES";

<strong i="9">@Override</strong>
public void onReceive(Context context, Intent intent) {

    if (intent != null) {
        final String action = intent.getAction();

        if (ACTION_PROCESS_UPDATES.equals(action)) {
            Utils.setLocationUpdatesResult(context, DateFormat.getDateTimeInstance().format(new Date()));
            try {
                Utils.getLocationUpdates(context,intent,"PROCESS_UPDATES");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}`

depois disso, crie a classe Utils que contém mehtod estático para a localização do valor de passagem e chama o construtor de notificação.

`public static void getLocationUpdates (contexto de contexto final, intent intent final, evento broadcast String) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService (NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

    Notification.Builder notificationBuilder = new Notification.Builder(context)
            .setContentTitle(" ")
            .setContentText(" ")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(contentIntent)
            .setOngoing(true)
            .setStyle(new Notification.BigTextStyle().bigText(" "))
            .setAutoCancel(true);
    notificationManager.notify(3, notificationBuilder.build());

} `.

Depois disso, na atividade principal, chame esta função:

`mFusedLocationClient.requestLocationUpdates (mLocationRequest, getPendingIntent ());

    LocationRequestHelper.getInstance(getActivity()).setValue("RequestingLocationUpdates",true);

    Task<Void> task = mActivityRecognitionClient.requestActivityUpdates(
            Utils.UPDATE_INTERVAL,
            getPendingIntent());

    task.addOnSuccessListener(new OnSuccessListener<Void>() {
        <strong i="21">@Override</strong>
        public void onSuccess(Void result) {

        }
    });
    task.addOnFailureListener(new OnFailureListener() {
        <strong i="22">@Override</strong>
        public void onFailure(<strong i="23">@NonNull</strong> Exception e) {
            //Log.i(TAG, "addOnFailureListener mActivityRecognitionClient "+e);
        }
    });`

e função getPending assim;

private PendingIntent getPendingIntent() { Intent intent = new Intent(getActivity(), LocationUpdatesBroadcastReceiver.class); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES); return PendingIntent.getBroadcast(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); }

Isso é tudo devido, e para parar a localização de atualização:

`if (getPendingIntent ()! = null && mFusedLocationClient! = null) {
mFusedLocationClient.removeLocationUpdates (getPendingIntent ());
}

    Utils.removeNotification(getActivity());

    if (getPendingIntent() != null && mActivityRecognitionClient != null) {
        Task<Void> task = mActivityRecognitionClient.removeActivityUpdates(
                getPendingIntent());

        task.addOnSuccessListener(new OnSuccessListener<Void>() {
            <strong i="33">@Override</strong>
            public void onSuccess(Void result) {
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            <strong i="34">@Override</strong>
            public void onFailure(<strong i="35">@NonNull</strong> Exception e) {

            }
        });
    }`

função remover notificação:

public static void removeNotification(Context context){ NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); notificationManager.cancelAll(); }

Obrigado senhor pela sua ótima resposta, mas aqui você pode ver o meu problema. Você pode, por favor, esclarecer meu problema. Eu realmente preciso de sua valiosa ajuda.
Obrigada

Primeiro você precisa da classe LocationUpdatesBroadcastReceiver extends BroadcastReceiver. Em seguida, transmissão interna:

`public static final String ACTION_PROCESS_UPDATES =".action "+
".PROCESS_UPDATES";

<strong i="10">@Override</strong>
public void onReceive(Context context, Intent intent) {

    if (intent != null) {
        final String action = intent.getAction();

        if (ACTION_PROCESS_UPDATES.equals(action)) {
            Utils.setLocationUpdatesResult(context, DateFormat.getDateTimeInstance().format(new Date()));
            try {
                Utils.getLocationUpdates(context,intent,"PROCESS_UPDATES");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}`

depois disso, crie a classe Utils que contém mehtod estático para a localização do valor de passagem e chama o construtor de notificação.

`public static void getLocationUpdates (contexto de contexto final, intent intent final, evento broadcast String) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService (NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

    Notification.Builder notificationBuilder = new Notification.Builder(context)
            .setContentTitle(" ")
            .setContentText(" ")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(contentIntent)
            .setOngoing(true)
            .setStyle(new Notification.BigTextStyle().bigText(" "))
            .setAutoCancel(true);
    notificationManager.notify(3, notificationBuilder.build());

} `.

Depois disso, na atividade principal, chame esta função:

`mFusedLocationClient.requestLocationUpdates (mLocationRequest, getPendingIntent ());

    LocationRequestHelper.getInstance(getActivity()).setValue("RequestingLocationUpdates",true);

    Task<Void> task = mActivityRecognitionClient.requestActivityUpdates(
            Utils.UPDATE_INTERVAL,
            getPendingIntent());

    task.addOnSuccessListener(new OnSuccessListener<Void>() {
        <strong i="22">@Override</strong>
        public void onSuccess(Void result) {

        }
    });
    task.addOnFailureListener(new OnFailureListener() {
        <strong i="23">@Override</strong>
        public void onFailure(<strong i="24">@NonNull</strong> Exception e) {
            //Log.i(TAG, "addOnFailureListener mActivityRecognitionClient "+e);
        }
    });`

e função getPending assim;

private PendingIntent getPendingIntent() { Intent intent = new Intent(getActivity(), LocationUpdatesBroadcastReceiver.class); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES); return PendingIntent.getBroadcast(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); }

Isso é tudo devido, e para parar a localização de atualização:

`if (getPendingIntent ()! = null && mFusedLocationClient! = null) {
mFusedLocationClient.removeLocationUpdates (getPendingIntent ());
}

    Utils.removeNotification(getActivity());

    if (getPendingIntent() != null && mActivityRecognitionClient != null) {
        Task<Void> task = mActivityRecognitionClient.removeActivityUpdates(
                getPendingIntent());

        task.addOnSuccessListener(new OnSuccessListener<Void>() {
            <strong i="34">@Override</strong>
            public void onSuccess(Void result) {
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            <strong i="35">@Override</strong>
            public void onFailure(<strong i="36">@NonNull</strong> Exception e) {

            }
        });
    }`

função remover notificação:

public static void removeNotification(Context context){ NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); notificationManager.cancelAll(); }

Obrigado senhor pela sua ótima resposta, mas aqui você pode ver o meu problema. Você pode, por favor, esclarecer meu problema. Eu realmente preciso de sua valiosa ajuda.
Obrigada

desculpe devido, a fim de obter localização de serviço para ser atendida para outra atividade é bastante difícil e eu não sei como fazê-lo.

Eu sei que era tarde, mas você pode encontrar o melhor código aqui

Eu sei que era tarde, mas você pode encontrar o melhor código aqui

oi estou recebendo este erro, você poderia me ajudar? MainActivity $ 2.onClick (MainActivity.java:99)
em android.view.View.performClick (View.java:4508)
em android.view.View $ PerformClick.run (View.java:18675)
em android.os.Handler.handleCallback (Handler.java:733)
em android.os.Handler.dispatchMessage (Handler.java:95)
em android.os.Looper.loop (Looper.java:136)
em android.app.ActivityThread.main (ActivityThread.java:5590)
em java.lang.reflect.Method.invokeNative (Método nativo)
em java.lang.reflect.Method.invoke (Method.java:515)
em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1280)
em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1096)
em dalvik.system.NativeStart.main (método nativo)

Eu sei que era tarde, mas você pode encontrar o melhor código aqui

oi estou recebendo este erro, você poderia me ajudar? MainActivity $ 2.onClick (MainActivity.java:99)
em android.view.View.performClick (View.java:4508)
em android.view.View $ PerformClick.run (View.java:18675)
em android.os.Handler.handleCallback (Handler.java:733)
em android.os.Handler.dispatchMessage (Handler.java:95)
em android.os.Looper.loop (Looper.java:136)
em android.app.ActivityThread.main (ActivityThread.java:5590)
em java.lang.reflect.Method.invokeNative (Método nativo)
em java.lang.reflect.Method.invoke (Method.java:515)
em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1280)
em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1096)
em dalvik.system.NativeStart.main (método nativo)

Desculpe, não consegui encontrar o seu problema, você pode descrever mais?

Eu sei que era tarde, mas você pode encontrar o melhor código aqui

oi estou recebendo este erro, você poderia me ajudar? MainActivity $ 2.onClick (MainActivity.java:99)
em android.view.View.performClick (View.java:4508)
em android.view.View $ PerformClick.run (View.java:18675)
em android.os.Handler.handleCallback (Handler.java:733)
em android.os.Handler.dispatchMessage (Handler.java:95)
em android.os.Looper.loop (Looper.java:136)
em android.app.ActivityThread.main (ActivityThread.java:5590)
em java.lang.reflect.Method.invokeNative (Método nativo)
em java.lang.reflect.Method.invoke (Method.java:515)
em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1280)
em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1096)
em dalvik.system.NativeStart.main (método nativo)

Desculpe, não consegui encontrar o seu problema, você pode descrever mais?

Me desculpe meu mal ... tentei usar este código na API 19, e quando você clica no botão app esmaga

Eu sei que era tarde, mas você pode encontrar o melhor código aqui

oi estou recebendo este erro, você poderia me ajudar? MainActivity $ 2.onClick (MainActivity.java:99)
em android.view.View.performClick (View.java:4508)
em android.view.View $ PerformClick.run (View.java:18675)
em android.os.Handler.handleCallback (Handler.java:733)
em android.os.Handler.dispatchMessage (Handler.java:95)
em android.os.Looper.loop (Looper.java:136)
em android.app.ActivityThread.main (ActivityThread.java:5590)
em java.lang.reflect.Method.invokeNative (Método nativo)
em java.lang.reflect.Method.invoke (Method.java:515)
em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1280)
em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1096)
em dalvik.system.NativeStart.main (método nativo)

Desculpe, não consegui encontrar o seu problema, você pode descrever mais?

Me desculpe meu mal ... tentei usar este código na API 19, e quando você clica no botão app esmaga

Preste atenção aqui ...

  1. Se houver problema com meu repositório, você terá que abrir um problema lá.
  2. Bro de acordo com meu arquivo gradle do repositório tem min Sdk é 22, então se você quiser usar em 19, mude um arquivo gradle.

Obrigada !

Também usei o código do SO vinculado acima, mas como passo o local encontrado de volta para meu aplicativo, para que possa atualizar as informações de local no Firebase? Obrigado!

Você pode fornecer o código completo?

Também usei o código do SO vinculado acima, mas como passo o local encontrado de volta para meu aplicativo, para que possa atualizar as informações de local no Firebase? Obrigado!

Você pode fornecer o código completo?

Você pode verificar meu repositório. Eu mencionei um link acima.

execute um serviço de primeiro plano e busque localização por ouvinte de localização. Seu aplicativo não será encerrado e funcionará o tempo todo. ou Use a API de reconhecimento de atividade para detectar movimentos do usuário e executar o código de busca de localização.

execute um serviço de primeiro plano e busque localização por ouvinte de localização. Seu aplicativo não será encerrado e funcionará o tempo todo. ou Use a API de reconhecimento de atividade para detectar movimentos do usuário e executar o código de busca de localização.

Eu fiz isso por meio de um serviço de primeiro plano. Tudo funciona muito bem. No entanto, estou curioso para saber se o modo doze ou wakelock afeta os serviços de primeiro plano. E cada chamada que vem do manipulador onNewLocation, eu envio os dados para uma api repousante para armazenar e depois visualizar no lado do administrador, embora isso esteja acabando com a bateria. Quaisquer dicas?

Em um serviço de primeiro plano, estou usando FusedLocationProviderClient para solicitar atualizações de localização. Se o GPS estiver desligado, não recebo a chamada onLocationResult () de volta. Como lidar com esse problema ?? Antes de iniciar o serviço, o local estava ativado e recebi alguns retornos de chamada no método onLocationResult (). Depois de algum tempo, o usuário desligou o GPS, depois disso eu não estou recebendo a chamada onLocationResult () de volta. Alguma ideia de como lidar com esse problema ??

Alguém pode me ajudar
Estou criando um aplicativo com as seguintes especificações:
· Este aplicativo tem como objetivo registrar as viagens do usuário.

· Sempre que o usuário deseja fazer uma viagem, ele / ela irá INICIAR a viagem. O aplicativo registrará a localização (por GPS / 4G) em um intervalo de tempo específico (por exemplo, 10 segundos, 1 minuto etc, um valor configurável por meio do menu). Sempre que o usuário terminar a viagem, ele irá PARAR a viagem.

· Todas as viagens serão salvas localmente no celular. O usuário deve ver a lista de todas as viagens salvas. Qualquer viagem deve ser selecionável, o que buscará os dados salvos, em forma de tabela.

· O próximo passo será a integração com a biblioteca GoogleMaps. Todos os pontos de localização registrados devem ser plotados na visualização GoogleMaps, para mostrar a viagem inteira (não no aplicativo GoogleMaps, mas no próprio aplicativo Track-My-Trip).

· A visualização GoogleMaps pode ser usada para rastreamento ao vivo da viagem atual, atualizado em tempo real.

Os seguintes elementos-chave devem ser usados:
-Android Studio
-LocationManager APIs
- métodos de armazenamento de dados, por exemplo, SharedPreferences ou SQLite DB
-Aprenda APIs do Google Maps
-Aprenda os componentes de IU do aplicativo Android

Resultados:
· Gravação de dados para 1 viagem.
· Lista de todas as viagens salvas
· Carregamento dos dados da viagem selecionada
· Traçando dados de viagem no Google Maps
· Plotagem ao vivo de dados de localização na visualização do Google Maps

Ei @ 99002688 , O rastreamento de localização deve acontecer em segundo plano ou enquanto o aplicativo está aberto. Se você deseja rastrear enquanto o aplicativo está aberto, você pode criar um aplicativo com um bloqueio Wake que não desligará a tela até que o usuário pressione o botão liga / desliga.

Com esta abordagem, você escreverá uma transmissão de rastreamento de localização usando a API de localização fundida e criará um Intent pendente que irá gerar uma Transmissão e, na transmissão, apenas faça o que você deseja fazer com os dados ou você pode ter retornos de chamada também e no retorno de chamada de locationresult apenas escreva o código que você deseja fazer com as coordenadas.

Se necessário, em segundo plano, mesmo quando o aplicativo é fechado e removido da pilha de atividades, prefiro que você use a abordagem de serviço de primeiro plano. Crie um serviço de primeiro plano que terá o código da API de localização fundida e, no resultado da localização, faça o que quiser.

Nota: os serviços de primeiro plano podem ser interrompidos em alguns dispositivos chineses como Xiaomi, Realme, Oppo, Vivo, etc. Para esses dispositivos, optei pela abordagem do gerenciador de alarmes, que aciona os serviços de primeiro plano a cada momento. (Nota> 10 min) e alguns podem funcionar com 5 min também.

Os gerenciadores de alarme são vulneráveis ​​às condições do modo de soneca, ou seja, eles podem atrasar quando o dispositivo entra no modo de soneca. para isso, usei o bloqueio One of the Wake, que liga a tela para fazer o dispositivo sair do modo de sono. (FULL_BRIGHTNESS).

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

nesquena picture nesquena  ·  11Comentários

nesquena picture nesquena  ·  4Comentários

savekirk picture savekirk  ·  8Comentários

debpedrano picture debpedrano  ·  8Comentários

kpradeepkumarreddy picture kpradeepkumarreddy  ·  5Comentários