Saturday, May 19, 2012

Calculate Speed Of Android Device By GPS

First Add These Permissions to Manifest File.



<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />



 Change Main.xml By
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView 
        android:id="@+id/textView1" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"     
        android:text= "Large Text"/>
</LinearLayout>
Create Class As Speed_of_mob_by_gpsActivity.java


package core.project.speed;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Speed_of_mob_by_gpsActivity extends Activity {
    /** Called when the activity is first created. */
 TextView speed;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        speed=(TextView)findViewById(R.id.textView1);
        
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    
        locationListener = new speedo();
    }

    private LocationListener locationListener;
    private LocationManager lm;
    
    public class speedo implements LocationListener
    {
     
     private String provider;
     Integer counter = 0;
     private Double[][] positions;
     private Long[] times;
     int data_points=2; // how many data points to calculate for
     public speedo()
     { 
      positions = new Double[data_points][2];
      times = new Long[data_points];
     }
     
     
  @Override
  public void onLocationChanged(Location loc) {
   // TODO Auto-generated method stub
      
   if (loc != null) {
               
    String speed_string;
                Double d1;
                Long t1;
                Double speed = 0.0;
                d1 = 0.0;
                t1 = 0l;
        
                positions[counter][0] = loc.getLatitude();
                positions[counter][1] = loc.getLongitude();
                times[counter] = loc.getTime();
                
                Log.i("positions[counter][0]",String.valueOf(positions[counter][0]));
                Log.i("positions[counter][1]",String.valueOf(positions[counter][1]));
                
                if (loc.hasSpeed()) {
                    speed = loc.getSpeed() * 1.0; // need to * 1.0 to get into a double for some reason...
                    }
            else {
                    try {
                            // get the distance and time between the current position, and the previous position.
                            // using (counter - 1) % data_points doesn't wrap properly
                            d1 = distance(positions[counter][0], positions[counter][1], positions[(counter+(data_points - 1)) % data_points][0], positions[(counter + (data_points -1)) %data_points][1]);
                            t1 = times[counter] - times[(counter + (data_points - 1)) % data_points];
                    } 
                    catch (NullPointerException e) {
                            //all good, just not enough data yet.
                    }
            
            speed = d1 / t1; // m/s            
            speed = speed *  2.23693629d; //mph
            
            //Log.i("speed",String.valueOf(speed));
            displayText(speed.intValue());
            }                
            counter = (counter + 1) % data_points;
  }
  }

  @Override
  public void onProviderDisabled(String provider) {
   // TODO Auto-generated method stub
    Log.i(getResources().getString(R.string.app_name), "provider disabled : " + provider);
  }

  @Override
  public void onProviderEnabled(String provider) {
   // TODO Auto-generated method stub
   Log.i(getResources().getString(R.string.app_name), "provider enabled : " + provider);
  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
   // TODO Auto-generated method stub
   Log.i(getResources().getString(R.string.app_name), "status changed : " + extras.toString());
  }
     
    }
    
    
    @Override
    public void onStop() {
        super.onStop();
        }
    
    @Override
    public void onPause() {
        lm.removeUpdates(locationListener);
        super.onPause();
    }
    
    @Override
    public void onResume() {
        super.onResume();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }

    
    private double distance(double lat1, double lon1, double lat2, double lon2) {
        // haversine great circle distance approximation, returns meters
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60; // 60 nautical miles per degree of seperation
        dist = dist * 1852; // 1852 meters per nautical mile  
        return (dist);
        }

        private double deg2rad(double deg) {
          return (deg * Math.PI / 180.0);
        }

        private double rad2deg(double rad) {
          return (rad * 180.0 / Math.PI);
        }
    
    public void displayText(Integer input) {
     
     speed.setText(String.valueOf(input)+"/kmph");
    }
}

No comments:

Post a Comment