Як я можу ввімкнути або відключити GPS програмно на Android?


158

Я знаю , що питання про включення / вимикання GPS на андроїд програмно вже були обговорені багато разів , і відповідь завжди один і той же:

"Ви не можете з міркувань безпеки / конфіденційності. Вам потрібно переслати на екран налаштувань місцеположення та дозволити користувачеві ввімкнути / вимкнути його."

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

Я хотів би зробити це у своєму додатку. Звичайно, я не хочу підірвати конфіденційність користувачів, тому спершу я б запитав користувача, чи хоче він автоматично ввімкнути його за допомогою типового поля "запам'ятати моє рішення", і якщо він відповість "так", увімкніть його.

Хтось має ідею чи підказку щодо того, як Tasker цього досягає?

Відповіді:


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 та інші подібні додатки.

Додайте це до свого створення

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

Тепер ця відповідь має бути прийнятою. Велике спасибі Акшат !!
Gurpreet

2
Потрібна інтеграція клієнтів Google API, отже, лише рішення для конкретних випадків використання, не підходить для загального рішення.
Cik

@DilroopSingh, з якою проблемою ти стикаєшся.? Я використовую той самий код, і він відмінно працює.
Акшат

1
чи можемо ми цього досягти, не показуючи цього будівельника. Тому що мені потрібно ввімкнути GPS, не показуючи жодних сповіщень.
Пунітапрія

3
@Punithapriya Це неможливо. Згода користувача є обов'язковою, і таким чином цей будівельник повинен бути показаний.
Акшат

50

ENABLE 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 вимкнено остаточний Intent poke = new Intent (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Намір.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ("3")); надіслатиBroadcast (ткнути); }}
Налагоджувач

в android 2.3.4, що працює на asamsung sII, він вмикає значок gps без ефективної активації датчика gps. Але якщо ви вирішите програмно увімкнути датчик GPS, він визнається.
tony gil

24
android 4.0.4 - увімкнено лише GPS повідомлення . не сам gps. тож схоже, що він увімкнений, але насправді це не так
Алекс

14
java.lang.SecurityException: Відмова в дозволі: заборонено надсилати трансляцію android.location.GPS_ENABLED_CHANGE
Абхі

28

Цей код працює на ВИКОРИСТАНИХ телефонах, якщо додаток переміщено /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
Шиванш

<використання-дозволу android: name = "android.permission.WRITE_SECURE_SETTINGS" /> лише для системних
апс

23

Замість використання налаштувань наміру.ACTION_LOCATION_SOURCE_SETTINGS ви можете безпосередньо показувати спливаючі вікна у вашому додатку, як Google Map & Gps, натиснувши кнопку ok, їх не потрібно перенаправляти на налаштування, просто вам потрібно використовувати мій код як

Примітка. Цей рядок коду автоматично відкриває діалогове вікно, якщо Місце розташування не ввімкнено. Цей шматок рядка також використовується в 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

Оскільки Android версії 4.4, ви не можете вмикати / вимикати 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

Випробувано з андроїдами 2.3.5 та 4.1.2.


зразок більше не доступний.
андроїд розробник

Ось останнє: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Я видалив стару версію випадково. BusyBox більше не потрібен.
OGP

досі недоступні. можливо скористатися іншою службою завантаження файлів?
андроїд розробник

Я зробив папку загальнодоступною та перевіреною. Тепер його можна завантажити. Також мій приватний 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, припустимо, у мене є вкорінене пристрій, що мені робити, щоб використовувати цей код? Я намагався отримати кореневий дозвіл на додаток, але це не допомогло. він постійно говорить "Відмова в дозволі: для написання безпечних налаштувань потрібен android.permission.WRITE_SECURE_SETTINGS"
андроїд розробник

@android Прочитайте останнє речення цього допису. Використання цього методу вимагає android.permission.WRITE_SECURE_SETTINGSдозволу в Manifest.
гобернадор

1
я знаю . я вже додав його. це говорить мені, що, хоча це вже є в маніфесті.
андроїд розробник


так що це неможливо навіть для вкорінених пристроїв ?!
андроїд розробник

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

Цей код працює на ВИКОРИСТАНИХ телефонах:

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

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


Дякую. Але Google Play Services 7 можна використовувати зі старими версіями Android? (API 14 - 23)
JCarlosR

1

Цей працює для мене.

Простіше, ніж відповідь Rj0078 у цьому питанні ( https://stackoverflow.com/a/42556648/11211963 ), але це також працює.

Він показує такий діалог:

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

(Написано Котліном)

    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);
} 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.