2013-04-27 61 views
1
  1. 我正在開發應用程序,我需要收集加速度計和位置數據&通過網絡服務器發送它們。我必須收集傳感器更改事件的數據。現在我試圖收集它,當我點擊開始按鈕,但不知何故,我沒有看到數據存儲在我的文件。任何人都可以幫助我嗎?Android收集和發送數據

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

    } 

} 
+0

嗨誰能幫助我在這個問題上? – 2013-04-28 20:25:20

+0

哦,我有一個類似的程序。我使用了一種服務來收集數據,因爲加速傳感器會每秒給你提供數據。所以這可能會殺死你的MainActivity的用戶界面。在那onSensorChanged - 方法我有一個「publishValue」 - 方法發送到Web服務器 – DuKes0mE 2013-04-28 20:36:47

+0

@ DuKes0mE,你能給我例子或什麼?我對android開發比較陌生。 – 2013-04-28 20:39:00

回答

1

在你的活動把這個變成你的Startbutton的的OnClick:

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

,並給你的STOPBUTTON:

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

創建一個新的C LASS比如像下面這樣:

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])); 


    }