1
  1. 我正在开发需要收集加速度计和位置数据并通过网络服务器发送它们的应用程序。我必须收集有关传感器更改事件的数据。现在,当我单击开始按钮时,我正在尝试收集它,但不知何故,我没有看到该数据存储在我的文件中。谁能帮我解决这个问题?

  2. 我必须将此数据发送到 MySQL 数据库进行处理(在 Web 服务器上)。我将如何将数据发送到服务器?

这是我现在尝试过的:

 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;
        }

    }

}
4

1 回答 1

1

在您的活动中,将其放入您的开始按钮的 OnClick 中:

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

这到你的停止按钮:

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

例如,创建一个新类,如下所示:

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

}

}

在这种方法中,我得到了这个:

    @Override
    public void onSensorChanged(SensorEvent event) {

        sendValuesToYourServer(Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) +","+ Float.toString(event.values[2])); 


    }
于 2013-04-28T21:46:06.667 回答