Reputation: 3020
I have to submit my mini project. I write a class to get the user location. I want to know if there is any technical problem in my approach or not. It works fine. I am Using a Handler to get the location continuously.
Main.java
public class Main extends Activity {
LocationTracker lt;
TextView tv;
Handler handler = new Handler();
Runnable locationRunner = new Runnable() {
@Override
public void run() {
if (lt.canGetLocation()) {
tv.setText(lt.getLatitude() + " " + lt.getLongitude());
}
handler.postDelayed(this, 1000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lt = new LocationTracker(this);
Toast.makeText(
this,
"GPS: " + lt.isGPSEnabled() + "\nNetwork: "
+ lt.isNetworkEnabled() + "\nCanGetLocation: "
+ lt.canGetLocation(), Toast.LENGTH_LONG).show();
tv = (TextView) findViewById(R.id.textView1);
}
@Override
protected void onResume() {
super.onResume();
handler.postDelayed(locationRunner, 1000);
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacks(locationRunner);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
LocationTracker.java
public class LocationTracker implements LocationListener {
private Context context;
private boolean isGPSEnabled;
private boolean isNetworkEnabled;
private boolean isTracking;
private Location location;
private LocationManager locationManager;
public LocationTracker(Context context) {
this.context = context;
locationManager = (LocationManager) context
.getSystemService(context.LOCATION_SERVICE);
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!isNetworkEnabled && !isGPSEnabled) {
isTracking = false;
} else {
isTracking = true;
}
if (isGPSEnabled) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, this);
} else if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, this);
}
}
public double getLatitude() {
if (location != null) {
return location.getLatitude();
} else {
return 0.00;
}
}
public double getLongitude() {
if (location != null) {
return location.getLongitude();
} else
return 0.00;
}
public boolean canGetLocation() {
return isTracking;
}
public boolean isGPSEnabled() {
return isGPSEnabled;
}
public boolean isNetworkEnabled() {
return isNetworkEnabled;
}
@Override
public void onLocationChanged(Location arg0) {
location = arg0;
}
@Override
public void onProviderDisabled(String arg0) {
}
@Override
public void onProviderEnabled(String arg0) {
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
}
}
`
Upvotes: 1
Views: 83
Reputation: 9574
Yeah, As I see it, 2 things are wrong.
requestLocationUpdates
.removeUpdates
, and requestLocationUpdates
.Sample code
//OnCreate
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new NetworkConnectionState(this.getApplicationContext()),
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
| PhoneStateListener.LISTEN_CELL_LOCATION );
//Your listener
public void onDataConnectionStateChanged(int state, int networkType) {
// We have changed protocols, for example we have gone from HSDPA to
// GPRS
// HSDPA is an example of a 3G connection
// GPRS is an example of a 2G connection
if (state == TelephonyManager.DATA_CONNECTED) {
}
else {
}
}
Edit :
Dont forget to update your connection / disconnection on onProviderDisabled
and onProviderEnabled
in your LocationListeners
Upvotes: 1
Reputation: 1
isTraking=false if gps and network are both disabled when app launch, it never change to true even user enable both gps or network during app running. You should use the logic in onProviderDisabled and onProviderEnabled methods.
Upvotes: 0