Use The Android Default Gps On-off Dialog In My Application
Solution 1:
You need to use the latest version of Google Play service. latest version has one dialog to activate all required things to get the GPS.
From Android Developer Play Service documentation,
Location settings - While the FusedLocationProviderApi combines multiple sensors to give you the optimal location, the accuracy of the location your app receives still depends greatly on the settings enabled on the device (GPS, wifi, airplane mode, and others). Using the new SettingsApi class, you can bring up a Location Settings dialog which displays a one-touch control for users to change their settings without leaving your app.
Link directs to Play Service version documentation. Version 7.0 has introduced this new prompt.
Solution 2:
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;
publicclassLocSettingsActivityextendsAppCompatActivityimplementsGoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest locationRequest;
intREQUEST_CHECK_SETTINGS=100;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loc_settings);
mGoogleApiClient = newGoogleApiClient.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);
}
@OverridepublicvoidonConnected(@Nullable Bundle bundle) {
LocationSettingsRequest.Builderbuilder=newLocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResultresult=
LocationServices.SettingsApi.checkLocationSettings(
mGoogleApiClient,
builder.build()
);
result.setResultCallback(this);
}
@OverridepublicvoidonConnectionSuspended(int i) {
}
@OverridepublicvoidonConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@OverridepublicvoidonResult(@NonNull LocationSettingsResult locationSettingsResult) {
finalStatusstatus= 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 dialogtry {
// 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 nowbreak;
}
}
@OverrideprotectedvoidonActivityResult(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'
}
Solution 3:
Ola Cabs is using the newly released Settings API to achieve this functionality. As per the new API the user is not required to navigate to the settings page to enable location services giving a seamless integration for the same. Please read this for more details.
Solution 4:
Step By Step
Step 1 check hasGPSDevice Support or not
Step 2 hasGPSDevice true check MarshMallow Permimssion
Step 3 MarshMallow Permimssion true check Location already on or not
Step 4 If Location on then CAll Gps Tracker and fetch Lat Long
Step 5 If Location oFf then CAll Location Dialog same AS Google Maps
Source Code
https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE
Add Dependency and Internet Permission
compile '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;
publicclassLocSettingsActivityextendsAppCompatActivityimplementsGoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest locationRequest;
intREQUEST_CHECK_SETTINGS=100;
GPSTracker gps;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Step 1
checkPermission();
}
@OverridepublicvoidonConnected(@Nullable Bundle bundle) {
LocationSettingsRequest.Builderbuilder=newLocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResultresult=
LocationServices.SettingsApi.checkLocationSettings(
mGoogleApiClient,
builder.build()
);
result.setResultCallback(this);
}
@OverridepublicvoidonConnectionSuspended(int i) {
}
@OverridepublicvoidonConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override// public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {publicvoidonResult(@NonNull Result locationSettingsResult) {
finalStatusstatus= 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 dialogtry {
// 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 nowbreak;
}
}
@OverrideprotectedvoidonActivityResult(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 ServicenewThread(newRunnable() {
@Overridepublicvoidrun() {
try {
Thread.sleep(2000); //Todo dummy delay for 2 second
} catch (InterruptedException e) {
e.printStackTrace();
}
//update ui on UI thread
runOnUiThread(newRunnable() {
@Overridepublicvoidrun() {
callLocationGpsTracker();
}
});
}
}).start();
} else {
callLocationDialog();
Log.e("Keshav", "..........GPS not enabled..............");
Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
}
}
}
@OverridepublicvoidonPointerCaptureChanged(boolean hasCapture) {
}
privatevoidcheckPermission(){
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) {
intpermissionCheck= ContextCompat.checkSelfPermission(LocSettingsActivity.this,
Manifest.permission.CAMERA);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Log.e("permission", "granted");
locationEnabled_or_Not();
} else {
ActivityCompat.requestPermissions(LocSettingsActivity.this,
newString[]{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 1publicbooleanhasGPSDevice(Context context) {
finalLocationManagermgr= (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
if (mgr == null)
returnfalse;
final List<String> providers = mgr.getAllProviders();
if (providers == null)
returnfalse;
return providers.contains(LocationManager.GPS_PROVIDER);
}
//TODO Step 2// TODO When Location not enabled show popup// TODO When Location already Enabled CAll GPS TrackerprivatevoidlocationEnabled_or_Not() {
Log.e("keshav", "locationEnabled_or_Not Step 2 Pass...........");
finalLocationManagermanager= (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 trueprivatevoidcallLocationDialog() {
Log.e("keshav", "callLocationDialog Step 3 Popup called ...........");
mGoogleApiClient = newGoogleApiClient.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 LongitudeprivatevoidcallLocationGpsTracker() {
Log.e("keshav", "callLocationGpsTracker Step 4 Called ... fetch Location");
gps = newGPSTracker(LocSettingsActivity.this);
// check if GPS enabledif (gps.canGetLocation()) {
doublelatitude= gps.getLatitude();
doublelongitude= 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();
}
}
privatevoidgetAddress(double lat, double lon) {
StringcityName="";
StringstateName="";
StringpostalCode="";
StringcountryName="";
StringBuilderfinalAddress=newStringBuilder();
try {
Geocodergeocoder=newGeocoder(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();
}
}
@OverrideprotectedvoidonResume() {
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;
publicclassGPSTrackerextendsServiceimplementsLocationListener {
privatefinal Context mContext;
// flag for GPS statusbooleanisGPSEnabled=false;
// flag for network statusbooleanisNetworkEnabled=false;
// flag for GPS statusbooleancanGetLocation=false;
Location location; // locationdouble latitude; // latitudedouble longitude; // longitude// The minimum distance to change Updates in metersprivatestaticfinallongMIN_DISTANCE_CHANGE_FOR_UPDATES=10; // 10 meters// The minimum time between updates in millisecondsprivatestaticfinallongMIN_TIME_BW_UPDATES=1000 * 60 * 1; // 1 minute// Declaring a Location Managerprotected LocationManager locationManager;
publicGPSTracker(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 Providerif (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 Servicesif (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
*/publicvoidstopUsingGPS() {
if (locationManager != null) {
locationManager.removeUpdates(GPSTracker.this);
}
}
/**
* Function to get latitude
*/publicdoublegetLatitude() {
if (location != null) {
latitude = location.getLatitude();
}
// return latitudereturn latitude;
}
/**
* Function to get longitude
*/publicdoublegetLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
// return longitudereturn longitude;
}
/**
* Function to check GPS/wifi enabled
*
* @return boolean
*/publicbooleancanGetLocation() {
returnthis.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
*/publicvoidshowSettingsAlert() {
AlertDialog.BuilderalertDialog=newAlertDialog.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", newDialogInterface.OnClickListener() {
publicvoidonClick(DialogInterface dialog, int which) {
Intentintent=newIntent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", newDialogInterface.OnClickListener() {
publicvoidonClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@OverridepublicvoidonLocationChanged(Location location) {
}
@OverridepublicvoidonProviderDisabled(String provider) {
}
@OverridepublicvoidonProviderEnabled(String provider) {
}
@OverridepublicvoidonStatusChanged(String provider, int status, Bundle extras) {
}
@Overridepublic IBinder onBind(Intent arg0) {
returnnull;
}
}
Source Code
https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE
Post a Comment for "Use The Android Default Gps On-off Dialog In My Application"