Reputation: 144
I'm trying to get my GPS speed using LocationListener
.
I ask for permission when starting the app the first time, permission is then granted and "onLocationChanged()" shows a toast immediately but never again.
I have location activated on my phone. But I don't get any more location updates.
I'm sorry for dumping all my code, but I'm not sure what to show.
Does anyone know what I'm missing here?
package com.example.username.yaddayadda;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.GpsStatus;
import android.location.LocationListener;
import android.location.Location;
import android.widget.Toast;
import java.util.Formatter;
import java.util.Locale;
@TargetApi(23)
public class MainActivity extends Activity implements LocationListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
try {
if (checkIfPermissionIsGranted()){
Toast toast = Toast.makeText(getApplicationContext(), "Permission is granted for fine and coarse location", Toast.LENGTH_LONG);
toast.show();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
}
else {
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION },
1);
if(checkIfPermissionIsGranted()){
Toast toast = Toast.makeText(getApplicationContext(), "Permission was granted for fine and coarse location", Toast.LENGTH_LONG);
toast.show();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
} else {
Toast toast = Toast.makeText(getApplicationContext(), "Permission was denied for fine and coarse location", Toast.LENGTH_LONG);
toast.show();
}
}
} catch(SecurityException e){
Context context = getApplicationContext();
CharSequence text = "Got exception: \n" + e.getMessage();
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
this.onLocationChanged(null);
}
private boolean checkIfPermissionIsGranted(){
return (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
}
@Override
public void onLocationChanged(Location location) {
TextView txt = (TextView) this.findViewById(R.id.txtCurrentSpeed);
Toast toast = Toast.makeText(getApplicationContext(), "onLocationChanged()", Toast.LENGTH_SHORT);
toast.show();
if(location==null){
txt.setText("-.- m/s");
}
else {
if(location.hasSpeed()){
float nCurrentSpeed = location.getSpeed();
txt.setText(nCurrentSpeed + " m/s");
} else {
txt.setText("0.0 m/s");
}
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Toast toast = Toast.makeText(getApplicationContext(), "onStatusChanged()", Toast.LENGTH_SHORT);
toast.show();
}
@Override
public void onProviderEnabled(String provider) {
Toast toast = Toast.makeText(getApplicationContext(), "onProviderEnabled()", Toast.LENGTH_SHORT);
toast.show();
}
@Override
public void onProviderDisabled(String provider) {
Toast toast = Toast.makeText(getApplicationContext(), "onProviderdisabled()", Toast.LENGTH_SHORT);
toast.show();
}
}
Upvotes: 1
Views: 179
Reputation: 37404
"onLocationChanged()" shows a toast immediately but never again.
You are not receiving any location updates but you are calling this function yourself here
// toast because of this , so no need of this , remove this call
this.onLocationChanged(null);
But I don't get any more location updates.
Because first time , you have the permissions then later once permissions are granted the you need to executed location request code again from onRequestPermissionsResult
.
So you need to override onRequestPermissionsResult
and once you have the permission grated then requestLocationUpdates
again like
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// location-related task you need to do.
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//Request location updates:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 1000*60, this);
}
} else {
// permission denied, Disable the
// functionality that depends on this permission.
}
return;
}
}
}
Note : it ideal to request location with both provider, just use the best one and you can move your location request code into separate function and call it from whenever required.
Reference
Upvotes: 3