2017-08-04 121 views
1

我正在研究需要用户位置的应用程序。如果用户关闭位置设置,我无法获取位置信息。因此,我遵循了Android培训提示的位置设置对话框,让用户开启位置设置上: https://developer.android.com/training/location/change-location-settings.html更改位置设置

public static void settingsRequest(final Activity activity) { 
     LocationRequest mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10000); 
     mLocationRequest.setFastestInterval(5000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(mLocationRequest); 
     builder.setAlwaysShow(true); 

     SettingsClient client = LocationServices.getSettingsClient(activity); 
     Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build()); 

     task.addOnSuccessListener(activity, new OnSuccessListener<LocationSettingsResponse>() { 
      @Override 
      public void onSuccess(LocationSettingsResponse locationSettingsResponse) { 
       // All location settings are satisfied. The client can initialize 
       // location requests here. 
       // ... 
      } 
     }); 

     task.addOnFailureListener(activity, new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 
       int statusCode = ((ApiException) e).getStatusCode(); 
       switch (statusCode) { 
        case CommonStatusCodes.RESOLUTION_REQUIRED: 
         // Location settings are not satisfied, but this can be fixed 
         // by showing the user a dialog. 
         try { 
          // Show the dialog by calling startResolutionForResult(), 
          // and check the result in onActivityResult(). 
          ResolvableApiException resolvable = (ResolvableApiException) e; 
          resolvable.startResolutionForResult(activity, 
            REQUEST_CHECK_SETTINGS); 
         } catch (IntentSender.SendIntentException sendEx) { 
          // Ignore the error. 
         } 
         break; 
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
         // Location settings are not satisfied. However, we have no way 
         // to fix the settings so we won't show the dialog. 
         break; 
       } 
      } 
     }); 
    } 

如果位置设置为关闭,显示对话框,但问题是,当用户触及对话框外,对话框消失。我怎样才能防止呢? (像setCanceledOnTouchOutside(false))?

请注意,位置设置对话框不是我的自定义对话框。因此,我不能设置setCancelable(假) 对话框显示,当这些代码被exccuted

// Show the dialog by calling startResolutionForResult(), 
          // and check the result in onActivityResult(). 
          ResolvableApiException resolvable = (ResolvableApiException) e; 
          resolvable.startResolutionForResult(activity, 
            REQUEST_CHECK_SETTINGS); 

回答

0

简单加入这一行你AlertDialogue();

.setCancelable(false) 

例如;

AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

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

    alertDialog.setCancelable(false); 

    // 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(); 
+0

注意位置设置对话框不是我的自定义对话框。显示我无法设置setCancelable(false) –

+0

那么你如何显示提示? –

+0

我已经编辑了我的问题 –

0

使用网络供应商位置,而不是

import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Criteria; 
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.support.v7.app.AlertDialog; 
import android.support.v7.view.ContextThemeWrapper; 
import android.util.Log; 




public class MyLocation extends Service implements LocationListener { 
    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 150; // 10 meters 
    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 10; // 1 minute 
    private final Context mContext; 
    // Declaring a Location Manager 
    protected LocationManager locationManager; 
    // flag for GPS status 
    boolean isGPSEnabled = false; 
    // flag for network status 
    boolean isNetworkEnabled = false; 
    // flag for Passive status 
    boolean isPassiveEnabled = false; 
    Location location; // location 

    double latitude; // latitude 
    double longitude; // longitude 

    public MyLocation(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); 
      // getting network status 
     //  isPassiveEnabled = locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER); 

      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS", "GPS"); 
        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 

      } 
      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 (isPassiveEnabled) { 
//    locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
//    Log.d("Passive Provider", "Passive"); 
//    if (locationManager != null) { 
//     location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); 
//     if (location != null) { 
//      latitude = location.getLatitude(); 
//      longitude = location.getLongitude(); 
//     } 
//    } 
//   } 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

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

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 
     return longitude; 
    } 
    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(new ContextThemeWrapper(mContext, R.style.myDialog)); 
     alertDialog.setTitle("GPS Settings"); 
     alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 
     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); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     alertDialog.show(); 
    } 

    public void showtimeSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(new ContextThemeWrapper(mContext, R.style.myDialog)); 
     alertDialog.setTitle("Date/Time Settings"); 
     alertDialog.setMessage("Automatic Date & time, Automatic time zone is not Enabled. You have to enable these settings"); 
     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(android.provider.Settings.ACTION_DATE_SETTINGS); 
       mContext.startActivity(intent); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     alertDialog.show(); 
    } 
    public void showHighAccuracySettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(new ContextThemeWrapper(mContext, R.style.myDialog)); 
     alertDialog.setTitle("High Accuracy Settings"); 
     alertDialog.setMessage("To get proper address, You have to enable High Accuracy settings"); 
     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     alertDialog.show(); 
    } 

    public boolean checkGpsEnable() { 

     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     return isGPSEnabled; 

    } 


    @Override 
    public void onLocationChanged(Location location) { 

     double lat = location.getLatitude(); 
     double lng = location.getLongitude(); 
     if (lat != 0.0 && lng != 0.0) { 
      setLatitude(location.getLatitude()); 
      setLongitude(location.getLongitude()); 
     } else { 
      getLocation(); 
     } 
    } 

    @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; 
    } 
} 
+0

你可以检查GPS是否启用此类“checkGpsEnable()” –