Как я могу включить или отключить GPS программно на Android?

158

Я знаю , что вопрос о включении / выключении GPS на андроид программно уже были обсуждены много раз , и ответ всегда один и тот же:

«Вы не можете по соображениям безопасности / конфиденциальности, вам нужно перейти на экран настроек местоположения и позволить пользователю включить / отключить его».

Я понимаю , что, тем не менее , я недавно купил Tasker с рынка и, среди многих других вещей , которые вы можете сделать с ним, вы можете установить правила для автоматического включения GPS на входе заранее определенного приложения и отключить его на выходе (см здесь для учебник о том, как это сделать, и он просто работает!) и это приложение не может быть подписано с помощью ключа подписи прошивки, так как оно работает на многих версиях Android и на разных устройствах, и вам даже не нужно рутироваться.

Я хотел бы сделать это в моем приложении. Конечно, я не хочу нарушать конфиденциальность пользователей, поэтому я сначала спросил бы пользователя, хочет ли он включить его автоматически с помощью стандартного флажка «запомнить мое решение» и, если он ответит «да», включите его.

У кого-нибудь есть идеи или подсказки о том, как Tasker достигает этого?

maid450
источник

Ответы:

161

GPS можно переключать, используя ошибку в виджете менеджера питания. см. эту ветку xda для обсуждения.

вот пример кода, который я использую

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);
    }
}

используйте следующее, чтобы проверить, является ли существующая версия виджета управления питанием той, которая позволит вам переключать 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
На момент написания этого (моего) комментария ссылки в этом ответе, похоже, указывают на то, что эта ошибка недавно была исправлена. Я просто хотел отметить, что эксплойт, похоже, работает нормально в моей собственной тестовой среде, поэтому не стоит отказываться от попыток сделать это ... просто будьте уверены, что ваш код будет обрабатывать любые ошибки, если он не работает !
SilithCrowe
1
На момент написания этого комментария этот эксплойт по- прежнему работает на телефоне Android 2.2.1. Хорошая находка, Бен Х.
Qix - МОНИКА БЫЛА ПОВТОРЕНА
38
Это действительно плохая идея. Как только ошибка будет исправлена, ваш эксплойт больше не будет работать. Лучше просто отправить пользователя в приложение настроек.
Эдвард Фальк
1
Работает нормально в Android 2.3.6, но не работает Android 4.0.3. Любая идея, чтобы включить или отключить в Android 4.0.3
Кришна
5
хахаха ... этот эксплойт появился снова в 4.2.2, удивился, увидев это .. БОГ!
amithgc
70

Все эти ответы сейчас не разрешены. Вот правильный:

Для всех тех, кто все еще ищет ответ:

Вот как это делают OLA Cabs и другие подобные приложения.

Добавьте это в свой 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;
            }
        }
    });
}

Это внедренные методы:

@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

}

Вот документация Android для того же.

Это чтобы помочь другим парням, если они все еще борются:

Изменить : Добавление комментария Ирфана Раза для получения дополнительной помощи.

@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 
         } 
    } 
} 
Akshat
источник
Теперь этот ответ должен быть принятым. Большое спасибо, Акшат !!
Gurpreet
2
Требуется интеграция с клиентом Google API, следовательно, только решение для конкретных случаев использования, не подходящее для универсального решения.
Cik
@DilroopSingh с какой проблемой вы сталкиваетесь.? Я использую тот же код, и он работает отлично.
Акшат
1
мы можем достичь этого без показа этого builder. Потому что мне нужно включить GPS, не показывая никаких предупреждений.
Punithapriya
3
@Punithapriya Это невозможно. Согласие пользователя является обязательным, и, таким образом, этот строитель должен быть показан.
Акшат
50

ВКЛЮЧИТЬ GPS:

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

ОТКЛЮЧИТЬ GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);
дебаггер
источник
1
GPS автоматически включится / выключится.
Отладчик
1
Это также помогает включить. private void turnGPSOn () {String provider = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// если gps отключен 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 (мешок); }}
Отладчик
в андроиде 2.3.4, работающем на asamsung sII, он включает иконку gps без эффективной активации датчика gps. Но если вы решите включить датчик GPS программно, он будет распознан.
Тони Гил
24
android 4.0.4 - включено только оповещение gps . не сам GPS. так что похоже, что он включен, но на самом деле это не так
alex
14
java.lang.SecurityException: отказ в разрешении: не разрешено отправлять трансляции android.location.GPS_ENABLED_CHANGE
Abhi
28

Этот код работает на телефонах с ROOTED, если приложение перемещено /system/aps , и они имеют следующие разрешения в манифесте :

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

Код

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 за упоминание этого метода. Он также должен работать с системным приложением на некорневом устройстве.
AlexS
это правильный путь. Работает на каждой версии Android, не нужно никаких хитростей!
BQuadra
отключение gps не работает !! Подскажите, пожалуйста, почему и возможное решение.
Шиванш
Теперь GPS отключается и включается отлично, но GPS не работает, то есть дает местоположение в течение долгого времени 0.0
Shivansh
<использует-разрешение android: name = "android.permission.WRITE_SECURE_SETTINGS" /> только для системных приложений
sijo jose
23

Вместо того, чтобы использовать намерение Settings.ACTION_LOCATION_SOURCE_SETTINGS, вы можете напрямую отображать всплывающие окна в своем приложении, такие как Google Map и Gps, при нажатии кнопки «ОК», их нет необходимости перенаправлять на настройки, просто вам нужно использовать мой код как

Примечание. Эта строка кода автоматически открывает диалоговое окно, если Местоположение не включено. Эта часть строки также используется в Google Map

 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) {

}
} 

Примечание. Эта строка кода автоматически открывает диалоговое окно, если Местоположение не включено. Эта часть строки также используется в Google Map

Черный конь
источник
1
этот код работает нормально, но не забыл разрешение на местоположение и банку playservice в файле Gradle ...
Akash pasupathi
22

Начиная с версии 4.4 Android, вы не можете включать / отключать GPS программно. Если вы попробуете код, предложенный в этом ответе , сработает исключение.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE
Амори Медейрос
источник
2
Так это комментарий или что решение?
Шилендра Мадда
@Shylendra Madda Нет решения для включения GPS. Вы можете только вызвать соответствующий системный диалог.
Невероятный Янв
6

Для программного включения или выключения GPS вам необходим доступ с правами root и установлен BusyBox. Даже с этим задача не тривиальна.

Пример здесь: Google Drive , Github , Sourceforge

Протестировано с Android 2.3.5 и 4.1.2.

ОГП
источник
образец больше не доступен.
Android-разработчик
Вот самая последняя: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Я стер старую версию случайно. BusyBox больше не требуется.
OGP
все еще не доступно. Может быть, использовать другой сервис загрузки файлов?
Android-разработчик
Я сделал папку общедоступной и проверил. Теперь его можно скачать. Также мой личный FTP здесь: StackExchange: se@oldgopher.gotdns.com
OGP
5

Над правильным ответом очень старый, нужно что-то новое, вот ответ

Как и в последнем обновлении, у нас есть поддержка androidx, поэтому сначала включите зависимость в файл уровня приложения build.gradle.

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

затем добавьте в свой файл манифеста:

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

не забудьте получить согласие пользователя на эти разрешения, если вы выпускаете

теперь вот код, просто используйте его

 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());
        }
    }
}

если что-то пойдет не так, пожалуйста, пинг меня

Мратюнджай Трипати
источник
2

Ответ был разработан в другом вопросе, но он был закрыт, и я хотел бы, чтобы сообщество тоже попробовало его.

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

Смотрите этот комментарий

Это решение требует бы WRITE_SETTINGSи WRITE_SECURE_SETTINGSразрешения.

гобернадор
источник
@milind, предположим, у меня есть рутированное устройство, что мне делать, чтобы использовать этот код? Я пытался получить разрешение root для приложения, но это не помогло. он продолжает говорить «Отказ в доступе: запись в безопасные настройки требует android.permission.WRITE_SECURE_SETTINGS»
разработчик Android
@android Прочитайте последнее предложение этого поста. Использование этого метода потребует android.permission.WRITE_SECURE_SETTINGSразрешения в Манифесте.
Гобернадор
1
Я знаю . я уже добавил это. это говорит мне, что, хотя это уже в манифесте.
Android-разработчик
так невозможно даже для рутованных устройств ?!
Android-разработчик
2

Может быть, с уловками отражения вокруг класса android.server.LocationManagerService.

Также есть метод (начиная с API 8) android.provider.Settings.Secure.setLocationProviderEnabled

Дамиан Колаковский
источник
3
Этот Settings.Secureкласс кажется многообещающим, однако я получаю исключение безопасности, в котором говорится, что мне нужен android.permission.WRITE_SECURE_SETTINGS, и я продолжаю получать сообщение об ошибке, даже добавляя это разрешение (и WRITE_SETTINGS) в мой манифест. Но, похоже, это хороший способ продолжить поиск. Спасибо :)
maid450
WRITE_SECURE_SETTINGSимеет уровень защиты, которыйsystemOrSignature вам нужен, чтобы сделать это приложение системным приложением, чтобы оно работало, что также упоминается в этом ответе .
Поток
2

Это лучшее решение, предоставленное Google Developers. Просто вызовите этот метод в onResume onCreate после инициализации 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)));
    }
}

Примечание : Эта строка кода автоматически открывает диалоговое окно, если Locationоно не включено. Эта часть строки также используется в Google Map

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
АМАН СИНГХ
источник
Что такое mLocationPermissionGranted ?
B Devloper
это для проверки, если разрешение предоставлено или нет для местоположения. это run timeразрешение предоставлено.
АМАН СИНГХ
Вы также можете пройти, просто установив значение истина, если вы уже предоставлено разрешение на предварительно леденец устройства
Aman Singh
2

Этот код работает на телефонах с 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();
        }
    }
}

Для отключения GPS вы можете использовать эту команду вместо

settings put secure location_providers_allowed -gps

Вы также можете переключать точность сети, используя следующие команды: для включения используйте:

settings put secure location_providers_allowed +network

а для выключения вы можете использовать:

settings put secure location_providers_allowed -network
DarwinFernandez
источник
1

С тех пор, как был опубликован этот вопрос, все изменилось, теперь с новым API Сервисов Google вы можете предложить пользователям включить GPS:

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

Вам нужно будет запросить разрешение ACCESS_FINE_LOCATION в своем манифесте:

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

Также посмотрите это видео:

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

Hooman
источник
Спасибо. Но Google Play Services 7 можно использовать со старыми версиями Android? (API 14 - 23)
JCarlosR
1

Этот работает для меня.

Это проще, чем ответ Rj0078 в этом вопросе ( https://stackoverflow.com/a/42556648/11211963 ), но этот также работает.

Это показывает диалог как это:

введите описание изображения здесь

(Написано на 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

Вам просто нужно удалить LocationListenerизLocationManager

manager.removeUpdates(listener);
пререкаться
источник
-1

Используйте этот код просто и легко получить доступ:

Разрешения:

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

Следуйте этому коду для программного доступа к GPS:

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);
} 
Гаурав Ламболе
источник