Мобильные данные и GPS включаются / выключаются программно - Android выше 5.0 тоже

Хочу реализовать Enable/Disable mobile data and GPS settings. Я искал доступный Android API для включения / отключения мобильных данных и настроек GPS, и ниже мои выводы.

Включение / отключение мобильных данных - 1. Можно выполнить включение / отключение в ‹5.0 ОС Android. 2. Начиная с 5.0+ Android OS, несистемное приложение пока не может включать / отключать мобильные данные. Начиная с версии 5.0 и выше, мы получаем это исключение, делая то же самое - что не для использования сторонними приложениями. Вызвано: java.lang.SecurityException: Neither user 10314 nor current process has android.permission.MODIFY_PHONE_STATE.

Есть ли какие-либо возможные / доступные решения?

Настройки GPS - 1. Мы можем включить местоположение программно, но еще не нашли способ отключить его (за исключением подхода Intent).

Кто-нибудь знает, как отключить GPS (Местоположение программно), не переходя в настройки через намерение.

Заранее спасибо.


person Manmohan Badaya    schedule 29.11.2016    source источник
comment
вызовите removeLocationUpdates (), чтобы прекратить использование GPS.   -  person Rushi Ayyappa    schedule 29.11.2016
comment
Вы запрашиваете разрешение на выполнение у пользователя в вашем приложении?   -  person Arpit Patel    schedule 29.11.2016
comment
@ArpitPatel Я ищу способ выполнить это, но из приложения.   -  person Manmohan Badaya    schedule 29.11.2016
comment
Есть ли какие-либо возможные / доступные решения? Нет ... потому что этот элемент управления, вероятно, должен оставаться за пользователем. Разработчику обычно требуется разрешение, чтобы включить GPS, чтобы использовать его, отключение GPS - это не то, что требуется, чтобы не использовать его :)   -  person Pararth    schedule 06.06.2017


Ответы (2)


Мы меняем настройки GPS, не переходя на экран настроек с помощью SettingsApi

Чтобы проверить, включен ли GPS или выключен, вы должны проверить, как показано ниже,

public class GPSActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static String TAG = "GPSActivity";

// Required for setting API
protected static final int REQUEST_CHECK_SETTINGS = 0x1;
GoogleApiClient googleApiClient;

private Button mBtnGPS;

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

    mBtnGPS = (Button) findViewById(R.id.btnGPS);

    mBtnGPS.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btnGPS:
            // Check GPS
            checkGps();
            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
    if (requestCode == REQUEST_CHECK_SETTINGS) {
        googleApiClient = null;
        checkGps();
    }
}

public void checkGps() {
    if (googleApiClient == null) {
        googleApiClient = new GoogleApiClient.Builder(GPSActivity.this)
                .addApiIfAvailable(LocationServices.API)
                .addConnectionCallbacks(this).addOnConnectionFailedListener(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:
                        Log.i("GPS", "SUCCESS");
                        //getFbLogin();
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        Log.i("GPS", "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(GPSActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Log.i("GPS", "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;
                    case LocationSettingsStatusCodes.CANCELED:
                        Log.i("GPS", "CANCELED");
                        break;
                }
            }
        });
    }
}

@Override
public void onConnected(Bundle bundle) {

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

}

Вот документация

person Harsh Patel    schedule 29.11.2016
comment
Я использовал тот же код для включения. Ищу отключить. Скажите, пожалуйста, знаете ли вы об этом. - person Manmohan Badaya; 29.11.2016
comment
Может быть невозможно. Потому что в официальной документации гугла я не нашел. Итак, нам нужно перемещаться по экрану настроек. @Manmohan - person Harsh Patel; 29.11.2016

Вот как запустить службу определения местоположения от поставщиков GPS и сети (Wi-Fi / данные).

LocationManager locationManager = (LocationManager)getContext().getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);        
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);

Если вы хотите прекратить прослушивание обновлений местоположения, запустите этот код: locationManager.removeUpdates(locationListener);

Одна строка кода перестала бы прослушивать любые обновления местоположения, независимо от поставщика (GPS / сеть), потому что LocationManager не заботится, откуда приходят обновления.

В вашем случае я предполагаю, что вы знаете, как создать пользовательский интерфейс, чтобы пользователь мог решить, использовать ли GPS / сеть или нет. А затем вы можете сделать что-то вроде этого:

if ( useGPS ) {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
}
if ( useNetwork ) {
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);
}

Если бы пользователь включил обоих поставщиков, обновления местоположения могли бы быть более точными. И если пользователь отключил обоих провайдеров, это не беда. Поскольку в LocationListener не будет приходить никаких обновлений, и это должно быть то, что хотел пользователь.

Кстати, вот код для создания LocationListener:

LocationListener locationListener =  new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // you may add some logic here to determine whether the new location update is more accurate than the previous one
            if ( isBetterLocation(location,currentBestLocation) ) {
                currentBestLocation = location;
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };
person CristianoYL    schedule 12.06.2017