Включите провайдеров местоположения программно в Android - PullRequest
7 голосов
/ 24 января 2012

Можно ли программно включить LocationProviders (GPS-провайдера / сетевых провайдеров) на устройстве, если оно выключено?

Ответы [ 6 ]

22 голосов
/ 24 января 2012

Нет, это не так, но вы можете открыть окно настроек услуг определения местоположения:

context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
6 голосов
/ 16 мая 2015

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

http://android -developers.blogspot.in / 2015/03 / Google-игры-сервисы 70-места-everyone.html

2 голосов
/ 26 июля 2012
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);
}
}

Но этот код поддерживается только до APK 8.

1 голос
/ 11 июля 2017

С недавним обновлением Marshmallow, даже когда параметр Location включен, вашему приложению потребуется явно запрашивать разрешение. Рекомендуемый способ сделать это - показать раздел «Разрешения» вашего приложения, в котором пользователь может переключать разрешение по мере необходимости. Фрагмент кода для этого приведен ниже:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
    if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Location Permission");
        builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app.");
        builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
    
            }
        });
        builder.setNegativeButton(android.R.string.no, null);
        builder.show();
    }
} else {
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean isGpsProviderEnabled, isNetworkProviderEnabled;
    isGpsProviderEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    isNetworkProviderEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if(!isGpsProviderEnabled && !isNetworkProviderEnabled) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Location Permission");
        builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app.");
        builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        });
        builder.setNegativeButton(android.R.string.no, null);
        builder.show();
    }
}

и переопределить метод onRequestPermissionsResult, как показано ниже:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_COARSE_LOCATION: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d(TAG, "coarse location permission granted");
            } else {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
        }
    }
}

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

1 голос
/ 21 ноября 2012

Да, но вы должны быть суперпользователем (sudo), ваше устройство должно быть рутовано.

0 голосов
/ 24 января 2012

Используйте следующий код для запуска GPS

locationManager = ( LocationManager ) getSystemService ( Context.LOCATION_SERVICE );
locationListener = new LocationListener();
locationManager.requestLocationUpdates ( LocationManager.GPS_PROVIDER, 0, 0, locationListener );

и следующий код для остановки GPS

locationManager.removeUpdates( locationListener );

Для получения дополнительной информации см. Документацию для LocationManager и для LocationListener .

...