15
respostas

Depreciação LocationServices.FusedLocationApi.removeLocationUpdates(client,request,this);

Gostaria de sabe, como implementar outro método que funcione , pois esse método esta depreciado

package alura.curso.br.com.agenda;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;


public class Localizador implements GoogleApiClient.ConnectionCallbacks, LocationListener {

    private final GoogleApiClient client;
    private final GoogleMap mapa;
    private Context context;

    public Localizador(Context context, GoogleMap mapa){
         client = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .build();

        client.connect();

        context.this = context;

        this.mapa = mapa;
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        LocationRequest request = new LocationRequest();
        //gps so vai atualizar se mover acima de 50 metros
        request.setSmallestDisplacement(50);
        //sao condicoes Se(If) e so vai atualizar quando passar 1 segundo(por isso 1000 esta em milisegundos)
        request.setInterval(1000);
        //priorizando melhor localizacao
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},753);
        }
        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},73);
        }

        LocationServices.FusedLocationApi.removeLocationUpdates(client,request,this);
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onLocationChanged(Location location) {
        LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(coordenada);
        mapa.moveCamera(cameraUpdate);
    }
}

Se não implementa desse jeito mais, se podia explicar como funciona na implementação do novo código.
15 respostas

Fala ai Marcos, de boa ?

Sim, isso ficou obsoleto :(

Dá uma olhadinha em como faz pra gente trabalhar atualmente com gps ( tá bem mais fácil ) :


public class GPS extends LocationCallback {

    private FusedLocationProviderClient client;


    public GPS(Context context) {
        this.client = LocationServices.getFusedLocationProviderClient(context);
    }

    @SuppressLint("MissingPermission")
    public void fazBusca() {
        LocationRequest req = new LocationRequest();

        req.setInterval(1000);
        req.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        req.setSmallestDisplacement(10);

        client.requestLocationUpdates(req, this, null);
    }


    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);

        // trabalha com o resultado
    }


    public void cancelaBusca() {
        client.removeLocationUpdates(this);
    }
}


amigo não conseguir botar pra funcionar, vou te passar Código eu gostaria que funcionasse como professor da aula III deixou funcionando. So com codigo que me falou não funciona.

te explicar mapaFragment parece mas quando mudo a localização não altera no mapa.

esse meu MapaFragments e chamo esses metodos que me falou assim...

        GPS gps = new GPS(getContext(),googleMap);
        gps.fazBusca();

a classe GPS


package tcc.reparro.br.com.reparoservicopublico.maps;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.v4.app.ActivityCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;

public class GPS extends LocationCallback implements LocationListener {

    private FusedLocationProviderClient client;
    private GoogleMap mapa;
    private Context context;

    public GPS(Context context, GoogleMap mapa){
        this.client = LocationServices.getFusedLocationProviderClient(context);
        this.mapa = mapa;
        this.context = context;
    }

    @SuppressLint("MissingPermission")
    public void fazBusca(){
        LocationRequest request = new LocationRequest();
        //deslocamento minimo para receber atualizacao gps
        request.setSmallestDisplacement(50);
        // intervalo minino para atualizacao do tempo gps em segundo intervalo
        request.setInterval(1000);
        //prioridade precisao alta, depende celular se tiver alguma ferramenta melhor pra pegar localizacao ele faz isso
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        //solicitando permissao receber sms
        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},795);
        }
        //solicitando permissao receber sms
        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},785);
        }
        client.requestLocationUpdates(request, this, null);
    }

    public void cancelarBusca(){
        client.removeLocationUpdates(this);
    }

    //localizacao mudou altualizacao de nosso mapa
    @Override
    public void onLocationChanged(Location location) {
        LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(coordenada);
        mapa.moveCamera(cameraUpdate);
    }
}

Marcos, tudo bem ?

Cara a api de gps mudou, a forma que o instrutor passou no video é a forma antiga.

A maneira que te passei é a mais recente, você precisa ter no seu Gradle algumas dependências pra fazer isso funcionar.


   implementation 'com.google.android.gms:play-services-location:15.0.1'

E o comportamento de pegar as informações do gps tu fará +- assim:

   @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);

    Location location = locationResult.getLastLocation();

        // trabalha com o resultado
    }

Amigo a biblioteca passada, já estava incluída. E não entendi o método que passou. Por favor explique como funciona os métodos. Gostaria saber como pegar automático o endereço pelo GPS, pela localização. Ou ativar gps, e consiga as coordenadas latitude, longitude...

Quando o GPS te der uma resposta, ele vai cair no método onLocationResult e você vai receber o resultado da localização via parâmetro.

Dentro desse resultado você consegue pegar a última localização e disso consegue trabalhar no seu aplicativo.

amigo assim não esta funcionando. Ele não mostra a localização.

Olá Marcos, tudo bem?

Tentei dar uma lida no seu código pela respostas anteriores mas acho que para te ajudar vou precisar ver o código dos seguintes arquivos:

AndroidManifest.xml
MapaFragment.java
GPS.java

Vendo esses arquivos completos acho que a gente consegue ter uma ideia melhor do que pode ser o problema.

Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tcc.reparro.br.com.reparoservicopublico">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />

    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality. 
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/logo_prefeitura"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/logo_prefeitura"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".Activity.MainActivity"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".Activity.LoginActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Activity.PessoaActivity" />

        <!-- Login facebook -->
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />

        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>
        <activity android:name=".Activity.RedefinirSenhaActivity" />
        <activity android:name=".Activity.EnderecoSolicitacaoActivity" />
        <activity android:name=".Activity.ReparosActivity" />
        <activity android:name=".Activity.ListaSolicitacaoActivity" />
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity android:name=".Activity.MapaActivity"></activity>
    </application>

</manifest>
package tcc.reparro.br.com.reparoservicopublico.maps;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

import java.io.IOException;
import java.util.List;

public class MapaFragment extends SupportMapFragment implements OnMapReadyCallback {

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        getMapAsync(this);
    }

    @Override
    //metodo de mapas google, onde vc manipula mapas
    public void onMapReady(GoogleMap googleMap) {



        if(ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},785);
        }
        new GPS(getContext(),googleMap).fazBusca();
    }


}
package tcc.reparro.br.com.reparoservicopublico.maps;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.v4.app.ActivityCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;

public class GPS extends LocationCallback implements LocationListener {

    private FusedLocationProviderClient client;
    private GoogleMap mapa;
    private Context context;

    public GPS(Context context, GoogleMap mapa){
        this.client = LocationServices.getFusedLocationProviderClient(context);
        this.mapa = mapa;
        this.context = context;
    }

    @SuppressLint("MissingPermission")
    public void fazBusca(){
        LocationRequest request = new LocationRequest();
        //deslocamento minimo para receber atualizacao gps
        request.setSmallestDisplacement(50);
        // intervalo minino para atualizacao do tempo gps em segundo intervalo
        request.setInterval(1000);
        //prioridade precisao alta, depende celular se tiver alguma ferramenta melhor pra pegar localizacao ele faz isso
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        client.requestLocationUpdates(request, this, null);
    }

    public void cancelarBusca(){
        client.removeLocationUpdates(this);
    }

    //localizacao mudou altualizacao de nosso mapa
    @Override
    public void onLocationChanged(Location location) {
        LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(coordenada);
        mapa.moveCamera(cameraUpdate);
    }

    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);
        LatLng coordenada = new LatLng(locationResult.getLastLocation().getLongitude(),1);
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(coordenada);
        mapa.moveCamera(cameraUpdate);
    }
}

Olá Marcos,

Aparentemente o código está correto, acredito que agora vou precisar que você zipe o seu projeto e suba em algum lugar (tipo Dropbox) para que eu possa baixá-lo e testá-lo por aqui. Assim fica mais fácil de descobrirmos o que pode estar impossibilitando a atualização da localização.

Meu amigo consegui achar o erro. Vou mandar onde estava errado.

    public void onLocationResult(LocationResult locationResult) {
        LatLng coordenada = new LatLng(locationResult.getLastLocation().getLatitude(), locationResult.getLastLocation().getLongitude());

        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(coordenada,20);
        mapa.moveCamera(cameraUpdate);
        MarkerOptions marcador = new MarkerOptions();
        marcador.position(coordenada);
        mapa.addMarker(marcador);
    }

Eu depurei o código e vi que não estava mudando a localização no mapa, isso devido esta usando metodo errado , que o certo é newLatLngZoom. Com o Zoom no final. Desde já agradeço.

Problema agora e que na localização, não pega nome da rua daqui de onde estou no caso na minha casa, pegando uma rua do centro aqui da cidade que não tem nada a ver. Sabe se tem como melhorar gps. Na configuração celular ja esta pra pegar GPS, Wifi...