Android active les gps avec AlertDialog: comment attendre que l'utilisateur prenne des mesures?

J'ai lu différents messages qu'il n'y a aucun moyen d'attendre que l'utilisateur prenne une action lorsqu'un AlertDialog est affiché car il bloque l'interface utilisateur.

Cependant, les applications comme Facebook par exemple, affiche le Gps actuellement désactivé. Voulez-vous activer les gps? Dialogue d'alerte et attendez que l'utilisateur appuie sur oui / non. Je pense qu'il est possible d'utiliser 2 activités différentes, la première ne contenant que la boîte de dialogue d'alerte aux gps, mais cela ne semble pas correct et ne semble pas bien être la façon dont Facebook fait cela.

  • JacksonParser databind et cause principale "Found duplicate file for APK"?
  • JQuery Drag and Drop sur les appareils tactiles (iPad, Android)
  • Comment chaîner plusieurs méthodes groupBy () de RxJava telles que groupBy (). GroupBy ()
  • Ajout de TextView dans LinearLayout comme des chips identiques à ceux de la suggestion d'adresse Gmail
  • Thème Google Maps pour Android
  • EditText d'Android est masqué lorsque le clavier virtuel est affiché et qu'un SurfaceView est impliqué
  • Quelqu'un peut-il me dire comment puis-je réussir?

    C'est mon code:

      @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); InitializeComponents(); EnableGPSIfPossible(); ListAsync lAsync = new ListAsync(this); lAsync .execute(); } private void EnableGPSIfPossible() { final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE ); if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) { buildAlertMessageNoGps(); } } private void buildAlertMessageNoGps() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { dialog.cancel(); } }); final AlertDialog alert = builder.create(); alert.show(); } 

    Donc, dans mon code, AsynTask démarre AsynTask sans attendre que l'utilisateur active les gps. (Ce qui est un comportement normal)

    Je vous remercie!

    5 Solutions collect form web for “Android active les gps avec AlertDialog: comment attendre que l'utilisateur prenne des mesures?”

    Ce que vous pouvez réellement faire, c'est ceci:

    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) { } } 

    Et ensuite de votre activité:

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

    Je l'ai fait en utilisant une fonction simple, mais sans afficher une boîte d'alerte, j'ai redirigé l'utilisation de la page de configuration

    Voici la fonction que j'ai utilisée

     public void isGPSEnable(){ LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabled = service .isProviderEnabled(LocationManager.GPS_PROVIDER); if (!enabled) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } } 

    J'ai réussi à faire fonctionner ce travail. Je me suis inspiré de cet article ici que j'ai trouvé sur stackoverlfow. http://developmentality.wordpress.com/2009/10/31/android-dialog-box-tutorial/

    J'ai essentiellement déplacé la logique que je devais exécuter sur les boutons "Oui" et "Annuler" de la boîte de dialogue d'alerte. Après avoir exécuté la logique nécessaire pour les boutons Oui et Annuler, je démarre l'exécution logique asynchrone.

    Voici mon code:

     public interface ICommand { void execute(); } 

    Les deux commandes concrètes utilisées pour activer Gps et les boutons Annuler de l'alerte Dialog:

     public class CancelCommand implements ICommand { protected Activity m_activity; public CancelCommand(Activity activity) { m_activity = activity; } public void execute() { dialog.dismiss(); //start asyncronous operation here } } public class EnableGpsCommand extends CancelCommand { public EnableGpsCommand( Activity activity) { super(activity); } public void execute() { // take the user to the phone gps settings and then start the asyncronous logic. m_activity.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); super.execute(); } } 

    Et maintenant, de l'activité:

     //returns true if the GpsProviderIsDisabled //false otherwise private boolean EnableGPSIfPossible() { final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE ); if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) { buildAlertMessageNoGps(); return true; } return false; } private void buildAlertMessageNoGps() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?") .setCancelable(false) .setPositiveButton("Yes", new CommandWrapper(new EnableGpsCommand(this))) .setNegativeButton("No", new CommandWrapper(new CancelCommand(this))); final AlertDialog alert = builder.create(); alert.show(); } 

    Maintenant à partir de la méthode Activity OnCreate, appelez simplement:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.newfriendlist); InitializeComponents(); if (!EnableGPSIfPossible()) { //then gps is already enabled and we need to do StartFriendRetrievalAsync from here. //otherwise this code is being executed from the EnableGpsIfPossible() logic. //Asyncronous logic here. } } 

    J'espère vraiment que cela vous aidera lorsque vous vous coincerez à ce point :).

    À votre santé

      final AlertDialog.Builder builder = new AlertDialog.Builder(this); final String action = Settings.ACTION_LOCATION_SOURCE_SETTINGS; final String message = "your message"; builder.setMessage(message) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int id) { getActivity().startActivity(new Intent(action)); d.dismiss(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int id) { d.cancel(); } }); builder.create().show(); 

    (Désolé pour mon anglais) Je cherchais une solution lorsque je vis ta question et ta question donne la réponse.

    Le problème est que l'activité continue de lancer pendant que l'alerte de dialogue est ouverte, et lorsque l'utilisateur appuie sur "OUI", une nouvelle activité démarrera "Paramètres de gps …" lorsque l'utilisateur retourne à la première activité après avoir configuré son gps ou Je vous ai simplement ignoré, cette même activité ne fera aucune mise à jour ou considérera que quelque chose (comme gps on) se produit car il est déjà chargé, donc vous devez écouter les mises à jour et appliquer les modifications ou simplement redémarrer l'activité lorsque l'utilisateur "retourne" , Pour moi, je viens d'ajouter:

     <activity ... android:noHistory="true" ... /> </activity> 

    Maintenant, chaque fois que l'utilisateur appuie sur le bouton "Retour", votre activité redémarrera compte tenu des nouvelles mises à jour qui ont fonctionné pour moi, j'espère que cela peut vous aider ou aider tout le monde

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.