Search code examples
javaandroidmysqlaccelerometer

Android collect and send data


  1. I am working on application where I need to collect accelerometer and location data & send them over web-server. I have to collect the data on sensor changed event. Right now I am trying to collect it when I click on start button, but somehow I don't see that data getting stored in my file. Could anyone help me with this ?

  2. I have to send this data to MySQL database for processing (on web-server). How will I send the data over to server?

Here is what I have tried right now :

 package myapp;

    import java.io.*;
    import java.util.ArrayList;
import java.util.List;

import app.AccelLocData;

import com.google.android.gms.maps.*;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapViewActivity extends Activity implements LocationListener,
        SensorEventListener, OnClickListener {

    GoogleMap googleMap;

    private boolean started = false;
    private ArrayList<AccelLocData> sensorData;
    private SensorManager sensorManager;
    private Button btnStart, btnStop;
    private String provider;

    // private Button btnUpload;

    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorData = new ArrayList<AccelLocData>();
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);
        btnStart.setOnClickListener(this);
        btnStop.setOnClickListener(this);
        btnStart.setEnabled(true);
        btnStop.setEnabled(false);

        int status = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getBaseContext());
        if (status != ConnectionResult.SUCCESS) { // Google Play Services are
                                                    // not available

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this,
                    requestCode);
            dialog.show();

        } else { // Google Play Services are available


            googleMap.setOnMapClickListener(new OnMapClickListener() {

                @Override
                public void onMapClick(LatLng latLng) {

                    // Creating a marker
                    MarkerOptions markerOptions = new MarkerOptions();

                    // Setting the position for the marker
                    markerOptions.position(latLng);

                    // Setting the title for the marker.
                    // This will be displayed on taping the marker
                    markerOptions.title(latLng.latitude + " : "
                            + latLng.longitude);

                    // Clears the previously touched position
                    googleMap.clear();

                    // Animating to the touched position
                    googleMap.animateCamera(CameraUpdateFactory
                            .newLatLng(latLng));

                    // Placing a marker on the touched position
                    googleMap.addMarker(markerOptions);
                }
            });

            // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);

            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            provider = locationManager.getBestProvider(criteria, true);
            Location location = locationManager.getLastKnownLocation(provider);

            if (location != null) {
                onLocationChanged(location);
            }

            locationManager.requestLocationUpdates(provider, 20000, 0, this);
        }

    }

    public void onSensorChanged(SensorEvent event) {

        if (started) {

            double x = event.values[0];
            double y = event.values[1];
            double z = event.values[2];

            long timestamp = System.currentTimeMillis();

            LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
            criteria.setAccuracy(Criteria.ACCURACY_FINE);

            provider = locManager.getBestProvider(criteria, true);
            Location location = locManager.getLastKnownLocation(provider);

            double latitude = 0;
            double longitude = 0;
            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();
            }
            AccelLocData data = new AccelLocData(timestamp, x, y, z, latitude,
                    longitude);

        //   System.out.println("Accel Data:" + data.toString());
    //       System.out.println("Latitude:" + latitude);
//           System.out.println("Longitude:" + longitude);

            sensorData.add(data);

        }
    }

    @Override
    public void onLocationChanged(Location location) {

        TextView tvLocation = (TextView) findViewById(R.id.tv_location);

        // Getting latitude of the current location
        double latitude = location.getLatitude();

        // Getting longitude of the current location
        double longitude = location.getLongitude();

        // Creating a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        // Showing the current location in Google Map
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        // Zoom in the Google Map
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
        System.out.println("Latitude:" + latitude + ", Longitude:" + longitude);

        // Setting latitude and longitude in the TextView tv_location
        // tvLocation.setText("Latitude:" + latitude + ", Longitude:" +
        // longitude);
    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnStart:
            btnStart.setEnabled(false);
            btnStop.setEnabled(true);
            // btnUpload.setEnabled(false);
        //  sensorData = new ArrayList<AccelLocData>();
            // save prev data if available
            started = true;
            try {
                File root = android.os.Environment
                        .getExternalStorageDirectory();
                File dir = new File(root.getAbsolutePath() + "/myapp");
                dir.mkdirs();
                File sensorFile = new File(dir, "acc.txt");

                // sensorFile.createNewFile();
                FileOutputStream fOut = new FileOutputStream(sensorFile);
                ObjectOutputStream myOutWriter = new ObjectOutputStream(fOut);
                System.out.println("Sensor data size:"+sensorData.size());
                for(int i=0;i<sensorData.size();i++){
                    System.out.println("Sensor Data:" + sensorData.get(i).getX());  
                }

                myOutWriter.writeObject(sensorData);
                myOutWriter.close();
                fOut.close();
            } catch (Exception e) {

            }
            Sensor accel = sensorManager
                    .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            sensorManager.registerListener(this, accel,
                    SensorManager.SENSOR_DELAY_FASTEST);
            break;
        case R.id.btnStop:
            btnStart.setEnabled(true);
            btnStop.setEnabled(false);
            // btnUpload.setEnabled(true);
            started = false;
            sensorManager.unregisterListener(this);

            // don't need chart
            // openChart();

            // show data in chart
            break;
        // case R.id.btnUpload:

        // break;
        default:
            break;
        }

    }

}

Solution

  • In your activity put this into your OnClick of your Startbutton:

    startService(new Intent(this, BackgroundService.class));
    

    and this to your Stopbutton:

    stopService(new Intent(this, BackgroundService.class));
    

    Create a new Class for example like the following:

    public class BackgroundService extends Service implements LocationListener,
        SensorEventListener{
    
    
    //Hint: there are some methods you need to implement which I forgot to mention but eclipse will add them for you
    
    @Override
    public void onCreate() {
    
    
    
        //enable networking, look into this: http://www.vogella.com/blog/2012/02/22/android-strictmode-networkonmainthreadexception/
    
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    
        //do your data collecting-methods and connect to your webserver
    
    
    }
    
    @Override
    public void onDestroy() {
           //unregister your sensor listener
    
    }
    
    }
    

    In this method I got this:

        @Override
        public void onSensorChanged(SensorEvent event) {
    
            sendValuesToYourServer(Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) +","+ Float.toString(event.values[2])); 
    
    
        }