Thursday, May 3, 2012

Calculate Device Moving Speed Programmatically

so this evening i would like to share with you new thing what i have learn..

some time we need to calculate moving speed of our android mobile device.

this example will calculate the location coordinates latitude-longitude after every 5 seconds gap.
and then calculate the speed of device in m/s.
all work done in background by the service.

so i we need to do is install this app into mobile and close now it started a background service
and calculate the speed forever..
[you can create without any activity also, but i have created an activity ans started the service from activity]

let's begin the coding, first of all we need to create a simple project having single activity like this
DeviceMovingSpeed.java
  
package com.rdc;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class DeviceMovingSpeed extends Activity// implements Runnable
{
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("Debug", "Activity started..");
Intent myIntent=new Intent(this,MyService.class);
startService(myIntent);
}
}

Now we need to create a service where we will handle all the stuff creating a thread Getting current location calculating coordinates latitude-longitude calculating distance and device moving speed
MyService.java
  
package com.rdc;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service
{
private LocationManager locManager;
private LocationListener locListener = new myLocationListener();
static final Double EARTH_RADIUS = 6371.00;

private boolean gps_enabled = false;
private boolean network_enabled = false;

private Handler handler = new Handler();
Thread t;

@Override
public IBinder onBind(Intent intent) {return null;}
@Override
public void onCreate() {}
@Override
public void onDestroy() {}
@Override
public void onStart(Intent intent, int startid) {}
@Override
public int onStartCommand(Intent intent, int flags, int startId){

Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_SHORT).show();

final Runnable r = new Runnable()
{ public void run()
{
Log.v("Debug", "Hello");
location();
handler.postDelayed(this, 5000);
}
};
handler.postDelayed(r, 5000);
return START_STICKY;
}

public void location(){
locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

try{
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch(Exception ex){}
try{
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch(Exception ex){}
Log.v("Debug", "in on create.. 2");
if (gps_enabled) {
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locListener);
Log.v("Debug", "Enabled..");
}
if (network_enabled) {
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locListener);
Log.v("Debug", "Disabled..");
}
Log.v("Debug", "in on create..3");
}

private class myLocationListener implements LocationListener
{
double lat_old=0.0;
double lon_old=0.0;
double lat_new;
double lon_new;
double time=10;
double speed=0.0;
@Override
public void onLocationChanged(Location location) {
Log.v("Debug", "in onLocation changed..");
if(location!=null){
locManager.removeUpdates(locListener);
//String Speed = "Device Speed: " +location.getSpeed();
lat_new=location.getLongitude();
lon_new =location.getLatitude();
String longitude = "Longitude: " +location.getLongitude();
String latitude = "Latitude: " +location.getLatitude();
double distance =CalculationByDistance(lat_new, lon_new, lat_old, lon_old);
speed = distance/time;
Toast.makeText(getApplicationContext(), longitude+"\n"+latitude+"\nDistance is: "
+distance+"\nSpeed is: "+speed , Toast.LENGTH_SHORT).show();
lat_old=lat_new;
lon_old=lon_new;
}
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
}

public double CalculationByDistance(double lat1, double lon1, double lat2, double lon2) {
double Radius = EARTH_RADIUS;
double dLat = Math.toRadians(lat2-lat1);
double dLon = Math.toRadians(lon2-lon1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2);
double c = 2 * Math.asin(Math.sqrt(a));
return Radius * c;
}
}

now come to AndroidManifest.xml
  






















okay!! that's it.. now run the application toast will appear to say :-
"current coordinates"
"distance if device is moving"
"and speed of device in m/s (meter/seconds)"

 cheers!!

 I'd love to hear your thoughts!

Labels: , , , , , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home