Подтвердить что ты не робот

Используйте диалоговое окно GPS ON-OFF Android по умолчанию в Моем приложении

В нашем приложении мы хотим интегрировать Android-диалог по умолчанию Android. Тот же диалог, который появляется, когда GPS выключен, и мы нажимаем кнопку моего местоположения в приложениях Google Maps. Также добавили изображение диалогового окна, которое я хочу интегрировать.

  • Нажав на кнопку "Нет", вы закроете диалоговое окно.
  • Нажав на кнопку "Да", вы активируете GPS-устройство напрямую.

Диалоговое окно для приложения OLA Ниже (ANDROID L):
enter image description here

Диалоговое окно для приложения OLA Ниже (ANDROID KIT_KAT):
enter image description here

Диалоговое окно отображается для карты Google ниже (ANDROID L):
enter image description here

Наша существующая реализация - когда GPS выключен, мы перенаправляем приложение на экран настроек местоположения по умолчанию устройства, откуда он может включить местоположение.

с нетерпением жду ответа. Спасибо заранее.

4b9b3361

Ответ 1

Вам нужно использовать последнюю версию сервиса Google Play. В последней версии есть один диалог, чтобы активировать все необходимые вещи, чтобы получить GPS.

Из документации разработчика Android Developer Play,

Настройки местоположения. В то время как FusedLocationProviderApi сочетает в себе множество датчиков для оптимального местоположения, точность местоположения, которое получает ваше приложение, в значительной степени зависит от настроек, установленных на устройстве (GPS, Wi-Fi, режим самолета и т.д.). Используя новый класс SettingsApi, вы можете открыть диалоговое окно "Настройки местоположения", в котором отображается элемент управления одним нажатием для пользователей, чтобы изменить их настройки, не выходя из своего приложения.

Ссылка направляет на версию версии Play Service. Версия 7.0 представила это новое приглашение.

Ответ 2


import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;

public class LocSettingsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {

    protected GoogleApiClient mGoogleApiClient;
    protected LocationRequest locationRequest;
    int REQUEST_CHECK_SETTINGS = 100;

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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).build();
        mGoogleApiClient.connect();

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);
        PendingResult result =
                LocationServices.SettingsApi.checkLocationSettings(
                        mGoogleApiClient,
                        builder.build()
                );

        result.setResultCallback(this);

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
        final Status status = locationSettingsResult.getStatus();
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:

                // NO need to show the dialog;

                break;

            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                //  Location settings are not satisfied. Show the user a dialog

                try {
                    // Show the dialog by calling startResolutionForResult(), and check the result
                    // in onActivityResult().

                    status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS);

                } catch (IntentSender.SendIntentException e) {

                    //failed to show
                }
                break;

            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are unavailable so not possible to show any dialog now
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CHECK_SETTINGS) {

            if (resultCode == RESULT_OK) {

                Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
            } else {

                Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
            }

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.google.android.gms:play-services-location:8.4.0'
}

Ответ 3

Ola Cabs использует недавно выпущенный API настроек для достижения этой функциональности. В соответствии с новым API пользователю не требуется перейти на страницу настроек, чтобы включить службы определения местоположения, обеспечивающие бесшовную интеграцию для них. Пожалуйста, прочитайте этот для более подробной информации.

Ответ 4

Шаг за шагом

Шаг 1: check hasGPSDevice Support или нет

Шаг 2 hasGPSDevice true check MarshMallow Permimssion

Шаг 3 MarshMallow Permimssion true check Местоположение уже включено или нет

Шаг 4. Если местоположение на CAL Gps Tracker и выбор Lat Long

Шаг 5 Если Location oFf, то CAll Location Dialog аналогичен Google Maps

Исходный код

https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE

Добавить зависимость и разрешение Интернета

compile 'com.google.android.gms: play-services-location: 8.4.0'

package com.keshav.locationenabledorcancelwithoutoutsideclick;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Result;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.keshav.locationenabledorcancelwithoutoutsideclick.gps.GPSTracker;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class LocSettingsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {

    protected GoogleApiClient mGoogleApiClient;
    protected LocationRequest locationRequest;
    int REQUEST_CHECK_SETTINGS = 100;

    GPSTracker gps;


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

        //Step 1
        checkPermission();

    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);
        PendingResult result =
                LocationServices.SettingsApi.checkLocationSettings(
                        mGoogleApiClient,
                        builder.build()
                );

        result.setResultCallback(this);
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
//    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
    public void onResult(@NonNull Result locationSettingsResult) {
        final Status status = locationSettingsResult.getStatus();
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:

                // NO need to show the dialog;

                break;

            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                //  Location settings are not satisfied. Show the user a dialog

                try {
                    // Show the dialog by calling startResolutionForResult(), and check the result
                    // in onActivityResult().

                    status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS);

                } catch (IntentSender.SendIntentException e) {

                    //failed to show
                }
                break;

            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are unavailable so not possible to show any dialog now
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CHECK_SETTINGS) {

            if (resultCode == RESULT_OK) {
                Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
                Log.e("Keshav", "..........GPS enabled..............");

                //TODO Important When Gps Enable Just Now Need Some Time ..........otherwise lat long 0.0 fetch
                // TODO Need Some time to call GPS Tracker Service
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);     //Todo dummy delay for 2 second
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        //update ui on UI thread
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                callLocationGpsTracker();
                            }
                        });
                    }
                }).start();


            } else {
                callLocationDialog();
                Log.e("Keshav", "..........GPS not enabled..............");
                Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
            }

        }
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }

    private void checkPermission(){
        if (!hasGPSDevice(LocSettingsActivity.this)) {
            Log.e("keshav", "Gps not Supported");
            Toast.makeText(LocSettingsActivity.this, "Gps not Supported", Toast.LENGTH_SHORT).show();
        } else {
            Log.e("keshav", "Gps Supported ---hasGPSDevice return true--Step 1 Pass...........");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                int permissionCheck = ContextCompat.checkSelfPermission(LocSettingsActivity.this,
                        Manifest.permission.CAMERA);

                if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                    Log.e("permission", "granted");
                    locationEnabled_or_Not();
                } else {
                    ActivityCompat.requestPermissions(LocSettingsActivity.this,
                            new String[]{Manifest.permission.CAMERA,
                                    Manifest.permission.READ_EXTERNAL_STORAGE,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                    Manifest.permission.ACCESS_FINE_LOCATION,
                                    Manifest.permission.ACCESS_COARSE_LOCATION,}, 1);
                }
            } else {
                Log.e("MainActivity", "Lower Than MarshMallow");
                locationEnabled_or_Not();
            }
        }
    }


    //TODO Step 1
    public boolean hasGPSDevice(Context context) {
        final LocationManager mgr = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (mgr == null)
            return false;
        final List<String> providers = mgr.getAllProviders();
        if (providers == null)
            return false;
        return providers.contains(LocationManager.GPS_PROVIDER);
    }


    //TODO Step 2
    // TODO When Location not enabled show popup
    // TODO When Location already Enabled CAll GPS Tracker
    private void locationEnabled_or_Not() {
        Log.e("keshav", "locationEnabled_or_Not Step 2 Pass...........");
        final LocationManager manager = (LocationManager) LocSettingsActivity.this.getSystemService(Context.LOCATION_SERVICE);
        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocSettingsActivity.this)) {
            Log.e("keshav", "Gps not enabled");
            callLocationDialog();
        } else {
            Log.e("keshav", "Gps already enabled");
            callLocationGpsTracker();           // TODO When Gps already enabled call direct GPS Tracker
        }
    }

    //TODO Step 3 when hasGPSDevice return true

    private void callLocationDialog() {

        Log.e("keshav", "callLocationDialog Step 3 Popup called ...........");

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).build();
        mGoogleApiClient.connect();

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
    }

    //TODO Step 4 when location on fetch GPS Tracker Through Latitude Longitude

    private void callLocationGpsTracker() {

        Log.e("keshav", "callLocationGpsTracker Step 4 Called ... fetch Location");

        gps = new GPSTracker(LocSettingsActivity.this);

        // check if GPS enabled
        if (gps.canGetLocation()) {

            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();

            Log.e("MainActivity", "latitude -> " + latitude);
            Log.e("MainActivity", "longitude -> " + longitude);

            getAddress(latitude, longitude);

//            LocationAddress locationAddress = new LocationAddress();
//            locationAddress.getAddressFromLocation(latitude, longitude,
//                    getApplicationContext(), new GeocoderHandler());

        } else {
            // TODO can't get location
            // TODO GPS or Network is not enabled
            // TODO Ask user to enable GPS/network in settings

            //TODO need again call Locaton Dialog
            callLocationDialog();
        }
    }

    private void getAddress(double lat, double lon) {
        String cityName = "";
        String stateName = "";
        String postalCode = "";
        String countryName = "";

        StringBuilder finalAddress = new StringBuilder();

        try {
            Geocoder geocoder = new Geocoder(LocSettingsActivity.this, Locale.getDefault());
            List<Address> addresses = geocoder.getFromLocation(lat, lon, 1);

            if (addresses != null) {

                try {
                    cityName = addresses.get(0).getLocality();
                    stateName = addresses.get(0).getAdminArea();
                    countryName = addresses.get(0).getCountryName();
                    postalCode = addresses.get(0).getPostalCode();

                    if (addresses.get(0).getAddressLine(0) != null)
                        finalAddress.append(addresses.get(0).getAddressLine(0));
                    if (addresses.get(0).getAddressLine(1) != null)
                        finalAddress.append(" " + addresses.get(0).getAddressLine(1));
                    if (addresses.get(0).getAddressLine(2) != null)
                        finalAddress.append(" " + addresses.get(0).getAddressLine(2));
                    if (addresses.get(0).getAddressLine(3) != null)
                        finalAddress.append(" " + addresses.get(0).getAddressLine(3));

                    Log.e("keshav", "addres 0   ->  " + addresses.get(0).getAddressLine(0));
                    Log.e("keshav", "addres 1   ->  " + addresses.get(0).getAddressLine(1));
                    Log.e("keshav", "addres 2   ->  " + addresses.get(0).getAddressLine(2));
                    Log.e("keshav", "addres 3   ->  " + addresses.get(0).getAddressLine(3));
                    Log.e("keshav", "addres final   ->  " + finalAddress);

                } catch (Exception e) {
                    Log.e("keshav", "Exception occurd    ->  " + e.getMessage());
                    e.printStackTrace();
                }
                Log.e("keshav", "cityName   ->  " + cityName);
                Log.e("keshav", "stateName ->  " + stateName);
                Log.e("keshav", "countryName ->  " + countryName);
                Log.e("keshav", "PostalCode ->  " + postalCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        checkPermission();
    }
}
===============================GPSTracker===================================

package com.keshav.locationenabledorcancelwithoutoutsideclick.gps;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }

                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);

                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

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

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     */

    public void stopUsingGPS() {
        if (locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     */

    public double getLatitude() {
        if (location != null) {
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     */

    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     *
     * @return boolean
     */

    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     */

    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");

        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

Исходный код

https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE