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" />
<?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