Como posso ativar ou desativar o GPS programaticamente no Android?


158

Eu sei que a questão sobre como ligar / desligar GPS programaticamente no Android tem sido discutido muitas vezes , ea resposta é sempre a mesma:

"Você não pode, por razões de segurança / privacidade, precisa encaminhar para a tela de preferências de localização e permitir que o usuário ative / desative".

Entendo que, no entanto, recentemente comprei o Tasker do mercado e, entre muitas outras coisas que você pode realizar com ele, é possível definir regras para ativar automaticamente o GPS ao entrar em aplicativos predeterminados e desativá-lo na saída (consulte aqui o tutorial sobre como fazê-lo, e simplesmente funciona!) e este aplicativo não pode ser assinado com a chave de assinatura de firmware, pois funciona em muitas versões do Android e em diferentes dispositivos, e você não precisa nem estar enraizado.

Eu gostaria de fazer isso no meu aplicativo. Obviamente, eu não quero aumentar a privacidade dos usuários, então, primeiro pergunto ao usuário se ele deseja ativá-lo automaticamente com a caixa de seleção típica "lembrar minha decisão" e se ele responder sim, habilite-o.

Alguém tem alguma idéia ou pista de como Tasker consegue isso?

Respostas:


161

o GPS pode ser alternado explorando um bug no widget do gerenciador de energia. veja este tópico xda para discussão.

aqui está um código de exemplo que eu uso

private void turnGPSOn(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(!provider.contains("gps")){ //if gps is disabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

private void turnGPSOff(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps")){ //if gps is enabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

use o seguinte para testar se a versão existente do widget de controle de energia é aquela que permitirá que você alterne os gps.

private boolean canToggleGPS() {
    PackageManager pacman = getPackageManager();
    PackageInfo pacInfo = null;

    try {
        pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);
    } catch (NameNotFoundException e) {
        return false; //package not found
    }

    if(pacInfo != null){
        for(ActivityInfo actInfo : pacInfo.receivers){
            //test if recevier is exported. if so, we can toggle GPS.
            if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){
                return true;
            }
        }
    }

    return false; //default
}

4
No momento deste (meu) comentário, os links nesta resposta parecem indicar que o bug que esta exploração foi corrigido recentemente. Eu só queria salientar que a exploração ainda parece funcionar muito bem no meu próprio ambiente de teste, então você não deve desistir de tentar isso ... apenas certifique-se de que seu código lidará com quaisquer erros se não funcionar !
22411 SilithCrowe

1
No momento da redação deste comentário, essa exploração ainda funciona em um telefone Android 2.2.1. Boa descoberta, Ben H.
Qix - MONICA FOI ERRADA

38
Esta é uma péssima ideia. Depois que o bug for corrigido, sua exploração não funcionará mais. Melhor apenas enviar o usuário ao aplicativo de configurações.
Edward Falk

1
Funcionando bem no Android 2.3.6, mas não funcionando no Android 4.0.3. Alguma idéia para ativar ou desativar no android 4.0.3
Krishna

5
hahaha ... essa façanha ressurgiu no 4.2.2, surpresa ao vê-la .. DEUS!
Amthgc

70

Todas essas respostas não são permitidas agora. Aqui está o correto:

Para todos aqueles que ainda procuram a resposta:

Veja como o OLA Cabs e outros aplicativos estão fazendo isso.

Adicione isso no seu onCreate

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(Login.this).build();
    googleApiClient.connect();
            LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    // **************************
    builder.setAlwaysShow(true); // this is the key ingredient
    // **************************

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi
            .checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result
                    .getLocationSettingsStates();
            switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                // All location settings are satisfied. The client can
                // initialize location
                // requests here.
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                // Location settings are not satisfied. But could be
                // fixed by showing the user
                // a dialog.
                try {
                    // Show the dialog by calling
                    // startResolutionForResult(),
                    // and check the result in onActivityResult().
                    status.startResolutionForResult(Login.this, 1000);
                } catch (IntentSender.SendIntentException e) {
                    // Ignore the error.
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are not satisfied. However, we have
                // no way to fix the
                // settings so we won't show the dialog.
                break;
            }
        }
    });
}

Estes são os métodos implementados:

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

Aqui está a documentação do Android para o mesmo.

Isso é para ajudar outros caras se eles ainda estão lutando:

Edit : Adicionando o comentário de Irfan Raza para mais ajuda.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 1000) {
         if(resultCode == Activity.RESULT_OK){
             String result=data.getStringExtra("result"); 
         } if (resultCode == Activity.RESULT_CANCELED) {
             //Write your code if there's no result 
         } 
    } 
} 

Agora, essa resposta deve ser a aceita. Muito obrigado Akshat !!
Gurpreet

2
Precisa da integração do cliente da API do Google, portanto, apenas uma solução para casos de uso específicos, não adequada para uma solução genérica.
Cik

@DilroopSingh que problema você está enfrentando? Estou usando o mesmo código e funciona perfeitamente.
Akshat

1
podemos conseguir isso sem mostrar esse construtor.Porque preciso ativar o gps sem mostrar nenhum alerta.
Punithapriya

3
@Punithapriya Isso não é possível. O consentimento do usuário é obrigatório e, portanto, esse construtor deve ser mostrado.
Akshat

50

ATIVAR GPS:

Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

DESATIVAR GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

1
automaticamente o GPS liga / desliga.
Debugger

1
Isso também ajuda a ativar. private void turnGPSOn () {String provider = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// se o gps estiver desativado final Intent poke = new Intent (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Intent.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ("3")); sendBroadcast (puxão); }}
Depurador

no android 2.3.4 rodando no asamsung sII, ele ativa o ícone gps sem ativar o sensor gps com eficácia. Mas, se você optar por ligar o sensor de GPS programaticamente, ele será reconhecido.
gil tony

24
android 4.0.4 - apenas a notificação de GPS está ativada. não o próprio GPS. por isso parece que é ligado, mas na verdade ele não é
alex

14
java.lang.SecurityException: negação de permissão: não é permitido enviar transmissão android.location.GPS_ENABLED_CHANGE
Abhi

28

Esse código funciona em telefones ROOTED se o aplicativo for movido para /system/aps , e eles têm as seguintes permissões no manifesto :

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

Código

private void turnGpsOn (Context context) {
    beforeEnable = Settings.Secure.getString (context.getContentResolver(),
                                              Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    String newSet = String.format ("%s,%s",
                                   beforeEnable,
                                   LocationManager.GPS_PROVIDER);
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   newSet); 
    } catch(Exception e) {}
}


private void turnGpsOff (Context context) {
    if (null == beforeEnable) {
        String str = Settings.Secure.getString (context.getContentResolver(),
                                                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        if (null == str) {
            str = "";
        } else {                
            String[] list = str.split (",");
            str = "";
            int j = 0;
            for (int i = 0; i < list.length; i++) {
                if (!list[i].equals (LocationManager.GPS_PROVIDER)) {
                    if (j > 0) {
                        str += ",";
                    }
                    str += list[i];
                    j++;
                }
            }
            beforeEnable = str;
        }
    }
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   beforeEnable);
    } catch(Exception e) {}
}

5
+1 por mencionar este método. Ele também deve funcionar com um aplicativo do sistema em um dispositivo não raiz.
Alexs

este é o caminho certo. Funciona em todas as versões do Android, sem necessidade de truques!
precisa saber é

desligar o gps não está funcionando !! Você pode me dizer o porquê e a possível solução.
Shivansh

agora o gps é desligar e ligar perfeitamente, mas o GPS não está trabalhando, ou seja, dando localização lat longo 0.0
Shivansh

<usos-permissão Android: name = "android.permission.WRITE_SECURE_SETTINGS" /> apenas para os APs do sistema
Sijo jose

22

Desde a versão 4.4 do Android, você não pode ativar / desativar o GPS programaticamente. Se você tentar o código proposto nesta resposta , uma exceção será acionada.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE

2
Então é um comentário ou então qual é a solução?
Shylendra Madda

@Shylendra Madda Não há solução para ativar o GPS. Você só pode chamar a caixa de diálogo correspondente do sistema.
O incrível Jan

22

Em vez de usar a intenção Settings.ACTION_LOCATION_SOURCE_SETTINGS, você pode exibir pop-up diretamente em seu aplicativo como o Google Map e Gps ao clicar no botão ok, não é necessário redirecionar para a configuração, basta usar meu código como

Nota: Essa linha de código abre automaticamente a caixa de diálogo se o Local não estiver ativado. Este pedaço de linha é usado no Google Map também

 public class MainActivity extends AppCompatActivity
    implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {


LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
PendingResult<LocationSettingsResult> result;
final static int REQUEST_LOCATION = 199;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    mGoogleApiClient.connect();

}

@Override
public void onConnected(Bundle bundle) {

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            //final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    //...
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_LOCATION);
                    } catch (SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    //...
                    break;
            }
        }
    });

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("onActivityResult()", Integer.toString(resultCode));

    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode)
    {
        case REQUEST_LOCATION:
            switch (resultCode)
            {
                case Activity.RESULT_OK:
                {
                    // All required changes were successfully made
                    Toast.makeText(MainActivity.this, "Location enabled by user!", Toast.LENGTH_LONG).show();
                    break;
                }
                case Activity.RESULT_CANCELED:
                {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(MainActivity.this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                    break;
                }
                default:
                {
                    break;
                }
            }
            break;
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}
} 

Nota: Essa linha de código abre automaticamente a caixa de diálogo se o Local não estiver ativado. Este pedaço de linha é usado no Google Map também


1
este código está funcionando bem, mas não esqueceu permissão localização e jar playservice no arquivo Gradle ...
Akash Pasupathi

6

Para ativar ou desativar o GPS programaticamente, você precisa de acesso 'root' e o BusyBox instalado. Mesmo com esses, a tarefa não é trivial.

A amostra está aqui: Google Drive , Github , Sourceforge

Testado com Androids 2.3.5 e 4.1.2.


amostra não está mais disponível.
desenvolvedor Android

Aqui está o mais recente: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Apaguei a versão antiga por acidente. O BusyBox não é mais necessário.
OGP

ainda não está disponível. talvez use um serviço de upload de arquivo diferente?
desenvolvedor Android

Tornei a pasta pública e verifiquei. Agora pode ser baixado. Também meu FTP privado aqui: StackExchange: se@oldgopher.gotdns.com
OGP


5

A resposta correta acima é muito antiga, precisa de algo novo, então aqui está a resposta

Como na última atualização, temos suporte para androidx, primeiro inclua dependência no arquivo build.gradle no nível do aplicativo

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

depois adicione seu arquivo de manifesto:

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

não se esqueça de obter o consentimento do usuário para essas permissões se você estiver liberando

agora aqui está o código, basta usá-lo

 protected void createLocationRequest() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    SettingsClient client = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());



    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...

            Toast.makeText(MainActivity.this, "Gps already open", 
                                          Toast.LENGTH_LONG).show();
            Log.d("location settings",locationSettingsResponse.toString());
        }
    });

    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode==REQUEST_CHECK_SETTINGS){

        if(resultCode==RESULT_OK){

            Toast.makeText(this, "Gps opened", Toast.LENGTH_SHORT).show();
            //if user allows to open gps
            Log.d("result ok",data.toString());

        }else if(resultCode==RESULT_CANCELED){

            Toast.makeText(this, "refused to open gps", 
                                         Toast.LENGTH_SHORT).show();
            // in case user back press or refuses to open gps
            Log.d("result cancelled",data.toString());
        }
    }
}

se algo der errado, por favor me ping


2

Uma resposta foi desenvolvida em outra pergunta, mas foi fechada e eu gostaria que a comunidade tentasse também.

boolean gpsStatus = locmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsStatus) {
    Settings.Secure.putString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network,gps");
}

Ver este comentário

Essa solução exigiria as permissões WRITE_SETTINGSe WRITE_SECURE_SETTINGS.


@ milind, suponha que eu tenha um dispositivo enraizado, o que devo fazer para usar esse código? Eu tentei obter uma permissão de root para o aplicativo, mas não ajudou. continua dizendo "Negação de permissão: gravar em configurações seguras requer android.permission.WRITE_SECURE_SETTINGS"
desenvolvedor android

@android Leia a última frase deste post. O uso desse método exigirá a android.permission.WRITE_SECURE_SETTINGSpermissão no manifesto.
Gobernador

1
eu sei . eu já adicionei. isso me diz que, apesar de já estar no manifesto.
desenvolvedor Android


então é impossível mesmo para dispositivos enraizados ?!
desenvolvedor android

2

Talvez com truques de reflexão ao redor da classe android.server.LocationManagerService.

Além disso, existe um método (desde a API 8) android.provider.Settings.Secure.setLocationProviderEnabled


3
Essa Settings.Secureclasse parece promissora, no entanto, recebo uma exceção de segurança dizendo que preciso de android.permission.WRITE_SECURE_SETTINGS e continuo recebendo o erro ao adicionar essa permissão (e WRITE_SETTINGS também) ao meu manifesto. Mas parece uma boa maneira de continuar pesquisando. Obrigado :)
maid450

WRITE_SECURE_SETTINGStem um nível de proteçãosystemOrSignature necessário para tornar esse aplicativo um sistema para que ele funcione, o que também é mencionado nesta resposta .
Fluxo

2

Esta é a melhor solução fornecida por Google Developers. Simplesmente chame esse método em onResume de onCreate após a inicialização GoogleApiClient.

private void updateMarkers() {
    if (mMap == null) {
        return;
    }

    if (mLocationPermissionGranted) {
        // Get the businesses and other points of interest located
        // nearest to the device's current location.
         mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);


        LocationSettingsRequest.Builder builder = new LocationSettingsRequest
                .Builder()
                .addLocationRequest(mLocationRequest);
        PendingResult<LocationSettingsResult> resultPendingResult = LocationServices
                .SettingsApi
                .checkLocationSettings(mGoogleApiClient, builder.build());

        resultPendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                final LocationSettingsStates locationSettingsStates = locationSettingsResult.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can
                        // initialize location requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied, but this can be fixed
                        // by showing the user a dialog.


                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    MainActivity.this,
                                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.


                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way
                        // to fix the settings so we won't show the dialog.


                        break;
                }

            }
        });


        @SuppressWarnings("MissingPermission")
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    // Add a marker for each place near the device's current location, with an
                    // info window showing place information.
                    String attributions = (String) placeLikelihood.getPlace().getAttributions();
                    String snippet = (String) placeLikelihood.getPlace().getAddress();
                    if (attributions != null) {
                        snippet = snippet + "\n" + attributions;
                    }

                    mMap.addMarker(new MarkerOptions()
                            .position(placeLikelihood.getPlace().getLatLng())
                            .title((String) placeLikelihood.getPlace().getName())
                            .snippet(snippet));
                }
                // Release the place likelihood buffer.
                likelyPlaces.release();
            }
        });
    } else {
        mMap.addMarker(new MarkerOptions()
                .position(mDefaultLocation)
                .title(getString(R.string.default_info_title))
                .snippet(getString(R.string.default_info_snippet)));
    }
}

Nota: Essa linha de código abre automaticamente a caixa de diálogo, se Locationnão estiver ativada. Este pedaço de linha é usado no Google Map também

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

O que é mLocationPermissionGranted ?
B devloper

ou seja, para verificar se a permissão é concedida ou não para Localização. isso é run timepermissão concedida.
AMAN SINGH

você também pode passar por simplesmente ajustando o valor verdade, se você já concedida a permissão em pré-pirulito dispositivo
AMAN SINGH

2

Este código funciona em telefones ROOTED:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] cmds = {"cd /system/bin" ,"settings put secure location_providers_allowed +gps"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Para desligar o GPS, você pode usar este comando

settings put secure location_providers_allowed -gps

Você também pode alternar a precisão da rede usando os seguintes comandos: para ativar o uso:

settings put secure location_providers_allowed +network

e para desligar, você pode usar:

settings put secure location_providers_allowed -network

1

As coisas mudaram desde que esta pergunta foi publicada. Agora, com a nova API de serviços do Google, você pode solicitar que os usuários ativem o GPS:

https://developers.google.com/places/android-api/current-place

Você precisará solicitar a permissão ACCESS_FINE_LOCATION no seu manifesto:

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

Assista também a este vídeo:

https://www.youtube.com/watch?v=F0Kh_RnSM0w


Obrigado. Mas o Google Play Services 7 pode ser usado com versões antigas do Android? (API 14 - 23)
JCarlosR

1

Este funciona para mim.

É mais simples que a resposta de Rj0078 nesta pergunta ( https://stackoverflow.com/a/42556648/11211963 ), mas essa também é funcionada.

Ele mostra uma caixa de diálogo como esta:

insira a descrição da imagem aqui

(Escrito em Kotlin)

    googleApiClient = GoogleApiClient.Builder(context!!)
        .addApi(LocationServices.API).build()
    googleApiClient!!.connect()
    locationRequest = LocationRequest.create()
    locationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    locationRequest!!.interval = 30 * 1000.toLong()
    locationRequest!!.fastestInterval = 5 * 1000.toLong()

    val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest!!)
    builder.setAlwaysShow(true)

    result =
       LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
    result!!.setResultCallback { result ->
        val status: Status = result.status
        when (status.statusCode) {
            LocationSettingsStatusCodes.SUCCESS -> {
               // Do something
            }
            LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->
                try {
                    startResolutionForResult(),
                    status.startResolutionForResult(
                        activity,
                        REQUEST_LOCATION
                    )
                } catch (e: SendIntentException) {
                }
            LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                // Do something
            }
        }
    }

0

Você só precisa remover a LocationListenerpartir deLocationManager

manager.removeUpdates(listener);

-1

Use este código Simples e fácil de acessar:

Permissões:

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

Siga este código para acessar o GPS programaticamente:

LocationManager locationManager ;
 boolean GpsStatus ;


            GPSStatus();

            if(GpsStatus == true)
            {
                textview.setText("Your Location Services Is Enabled");
            }else
                {textview.setText("Your Location Services Is Disabled");}

            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);


    public void GPSStatus(){
    locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    GpsStatus = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.