Настройте предупреждающее сообщение для служб определения местоположения при использовании FusedLocationProviderApi.

Я использую Fused Location Provider API, чтобы получить device location в своем проекте. Когда службы определения местоположения отключены, отображается alert dialog с просьбой включить их.

Есть ли способ настроить это диалоговое окно оповещения, чтобы отображалось другое сообщение?

диалог

Код:

LocationServices.getSettingsClient(this)
            .checkLocationSettings(locationRequestBuilder.build())
            .addOnCompleteListener {
                try { 
                    it.getResult(ApiException::class.java)
                    // Location settings are On
                } catch (exception: ApiException) { // Location settings are Off
                    when (exception.statusCode) {
                        RESOLUTION_REQUIRED -> try { // Check result in onActivityResult
                            val resolvable = exception as ResolvableApiException
                            resolvable.startResolutionForResult(this, LOCATION_REQUEST_CODE)
                        } catch (ignored: IntentSender.SendIntentException) {
                        } catch (ignored: ClassCastException) {
                        } 
                        // Location settings are not available on device
                    }
                }
            }

comment
Вы не можете изменить диалог. Это дело Гугла. Но вы можете определить, отключены ли службы, и выбрать отображение диалогового окна с просьбой перейти к настройкам и включить их для вас (или вы можете отправить пользователя в настройки, если хотите). Но диалоговое окно предназначено для того, чтобы вредоносные приложения не могли автоматически включать службы определения местоположения без вмешательства пользователя. Насколько я помню, вы не можете включить службы определения местоположения из своего кода, вы можете в лучшем случае отправить пользователя в настройки, чтобы он/она мог сделать это от вашего имени.   -  person Martin Marconcini    schedule 22.10.2019
comment
Я видел приложения, которые могут автоматически включать службы определения местоположения из пользовательского диалогового окна предупреждений (например, приложение погоды по умолчанию на телефонах Samsung).   -  person hamrosvet    schedule 22.10.2019
comment
У меня нет устройства Samsung (и я рад этому), но если приложение Samsung по умолчанию делает это на телефонах Samsung, то это ваша подсказка. : они могут делать все, что захотят, пока они контролируют свое оборудование и большую часть своего программного обеспечения. Известно, что Samsung сделала много умных и очень глупых вещей на Android. Это также может быть то, что делает Samsung. Попробуйте то же приложение на телефоне, отличном от Samsung. ;-)   -  person Martin Marconcini    schedule 22.10.2019
comment
Вы смотрели, например, этот вопрос/ответ о переполнении стека?   -  person Martin Marconcini    schedule 22.10.2019
comment
Я сделал, но это не помогло мне сделать то, что я хотел, поэтому я решил опубликовать это как отдельный вопрос.   -  person hamrosvet    schedule 22.10.2019


Ответы (1)


Попробуйте следующую строку кода

public void checkGpsStatus() {
        try {
            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);

            PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClientHome,   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:
                            hideGpsEnablDialog();
                            break;

                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            displayPromptForEnablingGPSSecond(MainActivity.this);
                            break;

                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

                            break;
                    }
                }
            });
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Dialog locationDialog;
    public boolean isDialogopen;
    public void displayPromptForEnablingGPSSecond(final Activity activity) {
        if (isDialogopen) {
            return;
        }
        final String action = Settings.ACTION_LOCATION_SOURCE_SETTINGS;
        try {
            locationDialog = new Dialog(activity);
            locationDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            locationDialog.setContentView(R.layout.dialog_confirm_type1);
            locationDialog.setCancelable(false);
            locationDialog.setCanceledOnTouchOutside(false);
            int width = activity.getWindowManager().getDefaultDisplay()
                    .getWidth();
            width = width - 80;
            locationDialog.getWindow().setLayout(width, ActionBar.LayoutParams.WRAP_CONTENT);

            TextView tv_message = (TextView) locationDialog
                    .findViewById(R.id.tv_message);

            tv_message.setText(""+getResources().getString(R.string.gps_enable_message));

            final TextView tv_ok = (TextView) locationDialog
                    .findViewById(R.id.tv_ok);

            final TextView tv_cancel = (TextView) locationDialog
                    .findViewById(R.id.tv_cancel);

            tv_ok.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    isDialogopen = false;
                    activity.startActivityForResult(new Intent(action), 11);
                    locationDialog.dismiss();
                }
            });

            tv_cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    isDialogopen = false;
                    hideGpsEnablDialog();
                }
            });
            locationDialog.show();
            isDialogopen = true;
        } catch (Exception e) {
            ExceptionHandler.printStackTrace(e);
        }
    }

    public void hideGpsEnablDialog() {
        try {
            if (locationDialog != null && locationDialog.isShowing()) {
                locationDialog.dismiss();
            }
            isDialogopen = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    if(!provider.contains("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(poke);
    }
}

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

    if(provider.contains("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(poke);
    }
}

Надеюсь, это поможет вам

person Ghanshyam    schedule 22.10.2019
comment
Этот метод не включает службы определения местоположения автоматически, а вместо этого переводит пользователя на экран настроек, где его необходимо включить вручную. Можно ли включить службы определения местоположения непосредственно из самого диалогового окна оповещения? - person hamrosvet; 22.10.2019
comment
да, можно напрямую включить местоположение, я обновил приведенный выше код, пожалуйста, проверьте и попробуйте. вы можете использовать метод turnGPSOn(), если хотите напрямую - person Ghanshyam; 22.10.2019
comment
Спасибо, но у меня это не работает (тестирование на API 26 Oreo). Кроме того, Settings.Secure.LOCATION_PROVIDERS_ALLOWED устарела. - person hamrosvet; 22.10.2019
comment
поставьте это разрешение и попробуйте ‹uses-permission android:name=android.permission.WRITE_SETTINGS/› ‹uses-permission android:name=android.permission.WRITE_SECURE_SETTINGS/› - person Ghanshyam; 23.10.2019