在我的应用程序中使用Android Default GPS ON-OFF对话框

在我们的应用程序中,我们要整合Android的默认GPS对话框。 与GPSclosures时出现的对话框相同,我们在Google地图应用程序中按下我的位置button。 还附加了我想要整合的对话框的图像。

  1. 点击“否”选项将closures对话框。
  2. 点击“是”选项将直接激活设备的GPS。

对话框显示OLA应用程序下面(ANDROID L):
在这里输入图像说明

对话框显示OLA应用程序下面(ANDROID KIT_KAT):
在这里输入图像说明

对话框出现在Google Map下面(ANDROID L):
在这里输入图像说明

我们现有的实施方式是当GPSclosures时,我们将应用程序redirect到设备的默认位置设置屏幕,从那里他/她可以打开位置。

期待着答案。 提前致谢。

Solutions Collecting From Web of "在我的应用程序中使用Android Default GPS ON-OFF对话框"

您需要使用最新版本的Google Play服务。 最新版本有一个对话框来激活所有需要的东西来获得GPS。

从Android Developer Play Service文档中,

位置设置 – 虽然FusedLocationProviderApi结合了多个传感器来为您提供最佳的位置,但是您的应用程序接收位置的准确性仍然大大取决于设备上启用的设置(GPS,wifi,飞行模式等)。 使用新的SettingsApi类,您可以调出一个位置设置对话框,该对话框显示一个单触式控件,供用户在不离开您的应用程序的情况下更改其设置。

链接指向Play服务版本文档。 7.0版引入了这个新的提示。

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' } 

奥拉出租车正在使用新发布的设置API来实现这一function。 根据新的API,用户不需要导航到设置页面来启用位置服务,从而实现相同的无缝集成。 请阅读这个更多的细节。

一步步

第1步检查是否有GPSDevice支持

第2步有GPSDevice真正检查MarshMallow Permimssion

步骤3 MarshMallow Permimssion true检查位置是否已经打开

步骤4如果在GPS全球定位追踪器上的位置并获取经纬度

第5步如果位置的CAll位置对话框相同的AS谷歌地图

源代码

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

添加依赖和Internet权限

编译'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