enabling GPS programmatically not working

后端 未结 4 1135
生来不讨喜
生来不讨喜 2021-01-28 15:31

I am trying to enable/disable (toggle) GPS programmatically in my app via a button click, but it is not working. Please help. My target devices are not rooted.

Here\'s t

相关标签:
4条回答
  • 2021-01-28 15:55

    you can force your app to see if you get a gps signal. if your not receiving signal, you can make a choise dialog, so the user can chose to go to the setings and turn on the gps.

    // GPSTracker class
    GPSTracker gps;
    
    // CHECK GPS!
    gps = new GPSTracker(YourActivityClass.this);
    if (gps.canGetLocation()) {
    } else {
        gps.showSettingsAlert();
    
            }
    

    Then make a new class file and paste this code in it.. I did not write this code. i found it somewhere, dont remember where i got it from.

     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;
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    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();
                        }
                    }
                }
                if (isNetworkEnabled) {
                    if (locationManager == null) {
                        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();
                            }
                        }
                    }
                }
            }
    
        } 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 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;
    }
     }
    

    in my app i have put in the shared prefs so the user can decide if he wants to check the gps or not. you can do it like this..

            SharedPreferences getData = PreferenceManager
                .getDefaultSharedPreferences(getBaseContext());
        String enableGPS = getData.getString("gps", "true");
        boolean enableGPSboolean = Boolean.parseBoolean(enableGPS);
    
        if (enableGPSboolean == (true)) {
    
            // CHECK GPS!
            // create class object
            gps = new GPSTracker(AddFish.this);
    
            if (gps.canGetLocation()) {
    
            } else {
    
                gps.showSettingsAlert();
    
            }
        }
    
    0 讨论(0)
  • 2021-01-28 16:03

    You can't enable GPS programatically. The most you can do is open the settings for the user to do that.

    You can do it like this:

    startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 100);
    
    0 讨论(0)
  • 2021-01-28 16:04

    I am trying to enable/disable (toggle) GPS programmatically in my app via a button click

    This is not possible on modern versions of Android, for obvious privacy reasons.

    but it is not working

    There is no android.location.GPS_ENABLED_CHANGE action in the Android SDK. There is one used internally, but it merely announces a state change -- it does not actually change the state itself.

    0 讨论(0)
  • // location manager
    

    LocationManager locationManager; LocationListener locationListener;

    obj_tgl_gps.setOnClickListener(new OnClickListener() {

            public void onClick(View v)
            {
                if (obj_tgl_gps.isChecked())
                {
                    Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
                    intent.putExtra("enabled", true);
                    sendBroadcast(intent);
                }
                else
                {
                    Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
                    intent.putExtra("enabled", false);
                    sendBroadcast(intent);
                }
    
            }
        });
    
    0 讨论(0)
提交回复
热议问题