Android activate gps with AlertDialog: how to wait for the user to take action?

后端 未结 5 785
春和景丽
春和景丽 2020-12-17 20:18

I\'ve read different posts that there is no way to wait for the user to take an action when an AlertDialog is shown because it blocks the UI.

However,

5条回答
  •  长情又很酷
    2020-12-17 21:14

    What you can actually do is this :

    GPSManager.java :

    public class GPSManager {
    
        private Activity activity;
        private LocationManager mlocManager;
        private LocationListener gpsListener;
    
        public GPSManager(Activity activity) {
            this.activity = activity;
        }
    
        public void start() {
            mlocManager = (LocationManager) activity
                    .getSystemService(Context.LOCATION_SERVICE);
    
            if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                setUp();
                findLoc();
            } else {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        activity);
                alertDialogBuilder
                        .setMessage("GPS is disabled in your device. Enable it?")
                        .setCancelable(false)
                        .setPositiveButton("Enable GPS",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        Intent callGPSSettingIntent = new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                        activity.startActivity(callGPSSettingIntent);
                                    }
                                });
                alertDialogBuilder.setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = alertDialogBuilder.create();
                alert.show();
    
            }
        }
    
        public void setUp() {
            gpsListener = new GPSListener(activity, mlocManager);
        }
    
        public void findLoc() {
            mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1,
                    gpsListener);
    
            if (mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) == null)
                Toast.makeText(activity, "LAST Location null", Toast.LENGTH_SHORT)
                        .show();
            else {
                gpsListener.onLocationChanged(mlocManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER));
            }
        }
    }
    

    GPSListener.java :

    public class GPSListener implements LocationListener {
    
        private Activity activity;
        private LocationManager lm;
        private int numberOfUpdates;
    
        public static final int MAX_NUMBER_OF_UPDATES = 10;
    
        public GPSListener(Activity activity, LocationManager lm) {
            this.activity = activity;
            this.lm = lm;
        }
    
        @Override
        public void onLocationChanged(Location loc) {
            if (numberOfUpdates < MAX_NUMBER_OF_UPDATES) {
                numberOfUpdates++;
    
                Log.w("LAT", String.valueOf(loc.getLatitude()));
                Log.w("LONG", String.valueOf(loc.getLongitude()));
                Log.w("ACCURACY", String.valueOf(loc.getAccuracy() + " m"));
                Log.w("PROVIDER", String.valueOf(loc.getProvider()));
                Log.w("SPEED", String.valueOf(loc.getSpeed() + " m/s"));
                Log.w("ALTITUDE", String.valueOf(loc.getAltitude()));
                Log.w("BEARING", String.valueOf(loc.getBearing() + " degrees east of true north"));
    
                String message;
    
                if (loc != null) {
                    message = "Current location is:  Latitude = "
                            + loc.getLatitude() + ", Longitude = "
                            + loc.getLongitude();
                    // lm.removeUpdates(this);
                } else
                    message = "Location null";
    
                Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
            } else {
                lm.removeUpdates(this);
            }
        }
    
        @Override
        public void onProviderDisabled(String provider) {
            Toast.makeText(activity, "Gps Disabled", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onProviderEnabled(String provider) {
            Toast.makeText(activity, "Gps Enabled", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
    
        }
    
    }
    

    And then from your activity :

    GPSManager gps = new GPSManager(
                                        yourActivity.this);
                                gps.start();
    

提交回复
热议问题