I am Making an App where we send user location on Server by using Api basically flow is when user launch an app after sometimes location prompt will popup and when user selects yes after that another code block will be implmented after 30 seconds by using Runnable Method. Everything is working fine only problem is after click yes Location Service is not starting I have to manually turn it on and after turning it on I am able to send lat long.Need some advice on this issue This is what I have tried till now. Thank you in advance!
LocationTrack.java
public class LocationTrack extends Service implements LocationListener {
private final Context mContext;
boolean checkGPS = false;
boolean checkNetwork = false;
boolean canGetLocation = false;
Location loc;
double latitude;
double longitude;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
protected LocationManager locationManager;
public LocationTrack(Context mContext) {
this.mContext = mContext;
getLocation();
}
private Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// get GPS status
// checkGPS = locationManager
// .isProviderEnabled(LocationManager.GPS_PROVIDER);
// get network provider status
checkNetwork = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!checkNetwork) {
Toast.makeText(mContext, "No Service Provider is available", Toast.LENGTH_SHORT).show();
} else {
this.canGetLocation = true;
if (checkNetwork) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
}
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
loc = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (loc != null) {
latitude = loc.getLatitude();
longitude = loc.getLongitude();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return loc;
}
public double getLongitude() {
if (loc != null) {
longitude = loc.getLongitude();
}
return longitude;
}
public double getLatitude() {
if (loc != null) {
latitude = loc.getLatitude();
}
return latitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
// public void showSettingsAlert() {
// AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
//
//
// alertDialog.setTitle("GPS is not Enabled!");
//
// alertDialog.setMessage("Do you want to turn on GPS?");
//
//
// alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
//
// }
// });
//
//
// alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// dialog.cancel();
// }
// });
//
//
// alertDialog.show();
// }
public void stopListener() {
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(LocationTrack.this);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
String url = "API";
String androidId, uuid;
String deviceDetails;
//location variables
double latitude, longitude, lng, lat;
private ArrayList<String> permissionsToRequest;
private ArrayList<String> permissionsRejected = new ArrayList<>();
private ArrayList<String> permissions = new ArrayList<>();
private final static int ALL_PERMISSIONS_RESULT = 101;
LocationTrack locationTrack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//location Permission
permissions.add(ACCESS_FINE_LOCATION);
permissions.add(ACCESS_COARSE_LOCATION);
permissionsToRequest = findUnAskedPermissions(permissions);
askLocation();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//device details
androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
uuid = UUID.randomUUID().toString();
getDeviceDetails();
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("CODE", "================================");
Log.i("Response", response);
Log.i("CODE", "================================");
Toast.makeText(MainActivity.this, "Successful", Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("CODE", "================================");
Log.i("Error", String.valueOf(error));
Log.i("CODE", "================================");
Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// if (locationTrack.canGetLocation()) {
//
//
// lng = locationTrack.getLongitude();
// lat = locationTrack.getLatitude();
//
// Toast.makeText(getApplicationContext(), "Longitude:" + Double.toString(longitude) + "\nLatitude:" + Double.toString(latitude), Toast.LENGTH_SHORT).show();
// }
Map<String, String> params = new HashMap<>();
params.put("lat", String.valueOf(lng));
params.put("lng", String.valueOf(lat));
params.put("android_id", androidId);
params.put("uuid", uuid);
params.put("device_details", deviceDetails);
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
queue.add(request);
}
}, 30000);
}
@SuppressLint("HardwareIds")
public void getDeviceDetails() {
deviceDetails = "SERIAL : " + Build.SERIAL + " , " +
"MODEL: " + Build.MODEL + " , " +
"ID: " + Build.ID + " , " +
"Manufacture: " + Build.MANUFACTURER + " , " +
"Brand: " + Build.BRAND + " , " +
"SDK: " + Build.VERSION.SDK_INT + " , " +
"Version Code: " + Build.VERSION.RELEASE;
Toast.makeText(MainActivity.this, "Successful" + deviceDetails, Toast.LENGTH_LONG).show();
}
//location methods
private ArrayList<String> findUnAskedPermissions(ArrayList<String> wanted) {
ArrayList<String> result = new ArrayList<String>();
for (String perm : wanted) {
if (!hasPermission(perm)) {
result.add(perm);
}
}
return result;
}
private boolean hasPermission(String permission) {
if (canMakeSmores()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
}
}
return true;
}
private boolean canMakeSmores() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == ALL_PERMISSIONS_RESULT) {
for (String perms : permissionsToRequest) {
if (!hasPermission(perms)) {
permissionsRejected.add(perms);
}
}
if (permissionsRejected.size() > 0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(permissionsRejected.get(0))) {
showMessageOKCancel("These permissions are mandatory for the application. Please allow access.",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsRejected.toArray(new String[0]), ALL_PERMISSIONS_RESULT);
}
}
});
}
}
}
}
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
private void askLocation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionsToRequest.size() > 0)
requestPermissions(permissionsToRequest.toArray(new String[0]), ALL_PERMISSIONS_RESULT);
}
locationTrack = new LocationTrack(MainActivity.this);
if (locationTrack.canGetLocation()) {
longitude = locationTrack.getLongitude();
latitude = locationTrack.getLatitude();
Toast.makeText(getApplicationContext(), "Longitude:" + (longitude) + "\nLatitude:" + (latitude), Toast.LENGTH_SHORT).show();
} else {
// locationTrack.showSettingsAlert();
longitude = locationTrack.getLongitude();
latitude = locationTrack.getLatitude();
}
lat = latitude;
lng = longitude;
}
@Override
protected void onDestroy() {
super.onDestroy();
locationTrack.stopListener();
}
}