2013-04-28 9 views
3

我在寫一個應用程序,我必須將數據存儲在文件中以獲取加速度計值。我怎麼做 ?我只需要創建一個文件並在該文件中添加數據。這是應用程序的流程:Android Accelerometer將數據存儲在文件中

  1. 用戶單擊開始按鈕,它應該開始將傳感器數據寫入文件。
  2. 用戶點擊停止按鈕,應該停止將數據寫入文件。

PLZ幫助..

編輯1:代碼根據@iTech但它並不追加數據。

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; 

    File root, dir, sensorFile; 
    FileOutputStream fOut; 
    // ObjectOutputStream myOutWriter; 
    private Sensor mAccelerometer; 
    private FileWriter writer; 

    // private Button btnUpload; 

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

     try { 
      root = android.os.Environment.getExternalStorageDirectory(); 
      dir = new File(root.getAbsolutePath() + "/myapp"); 
      dir.mkdirs(); 

      File oldFile = new File(dir, "data.txt"); 

      boolean deleted = oldFile.delete(); 
      System.out.println("Delete status = " + deleted); 
      sensorFile = new File(dir, "data.txt"); 

      sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
      mAccelerometer = sensorManager 
        .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 


      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 

       // Getting reference to the SupportMapFragment of 
       // activity_main.xml 
       // SupportMapFragment supportMapFragment = (MapFragment) 
       // getFragmentManager().findFragmentById(R.id.map); 

       // Getting GoogleMap object from the fragment 
       googleMap = ((MapFragment) getFragmentManager() 
         .findFragmentById(R.id.map)).getMap(); 
       // googleMap = supportMapFragment.getMap(); 

       // can use for overlay on the map 
       List<Double> latList = new ArrayList<Double>(); 
       latList.add(45.7309593); 
       latList.add(46.34); 
       latList.add(47.34); 

       List<Double> lonList = new ArrayList<Double>(); 
       lonList.add(-122.6365384); 
       lonList.add(-123.6365384); 
       lonList.add(-124.6365384); 

       for (int i = 0; i < 3; i++) { 
        // LatLng latLng = new LatLng(45.7309593, -122.6365384); 
        LatLng latLng = new LatLng(latList.get(i).doubleValue(), 
          lonList.get(i).doubleValue()); 
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
        googleMap 
          .addMarker(new MarkerOptions() 
            .position(latLng) 
            .title("My Spot") 
            .snippet("This is my spot!") 
            .icon(BitmapDescriptorFactory 
              .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 
       } 
       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); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    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("data x:" + data.getX()); 

      try { 
       writer.write(data.toString()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 

    @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 onClick(View v) { 
     switch (v.getId()) { 
     case R.id.btnStart: 

      btnStart.setEnabled(false); 
      btnStop.setEnabled(true); 
      System.out.println("cam on click of start"); 
      started = true; 

      sensorManager.registerListener(this, mAccelerometer, 
        SensorManager.SENSOR_DELAY_FASTEST); 
      break; 
     case R.id.btnStop: 
      try { 
       btnStart.setEnabled(true); 
       btnStop.setEnabled(false); 
       // btnUpload.setEnabled(true); 
       started = false; 

       sensorManager.unregisterListener(this); 

       /* 
       * if(writer != null) { try { writer.close(); } catch 
       * (IOException e) { // TODO Auto-generated catch block 
       * e.printStackTrace(); } } 
       */} catch (Exception e) { 
       e.printStackTrace(); 
      } 
      break; 
     default: 
      break; 
     } 

    } 

    protected void onPause() { 
     super.onPause(); 

     if (writer != null) { 
      try { 
       writer.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    protected void onResume() { 
     super.onResume(); 
     try { 
      System.out.println("called onresume"); 
      writer = new FileWriter(sensorFile, true); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @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 

    } 

} 

回答

3

以下是您開始使用的示例代碼。

您可以檢查android示例以瞭解如何從傳感器讀取數據,然後將其寫入文件。

若要運行此代碼,您將需要添加兩個按鈕並設置其onClickonStartClickonStopClick。您也可以指定輸出文件路徑在SD卡上。

public class Main extends Activity implements SensorEventListener { 

private SensorManager mSensorManager; 
private Sensor mAccelerometer; 
private FileWriter writer; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activiy_main); 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
} 

public void onStartClick(View view) { 
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 

public void onStopClick(View view) { 
    mSensorManager.unregisterListener(this); 
} 
protected void onResume() { 
    super.onResume(); 
    writer = new FileWriter("myfile.txt",true); 
} 

protected void onPause() { 
    super.onPause(); 

    if(writer != null) { 
     writer.close(); 
    } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

@Override 
public void onSensorChanged(SensorEvent event) { 

    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
    writer.write(x+","+y+","+z+"\n"); 

} 
} 
+0

感謝您的回答。它第一次工作,但是當我點擊開始按鈕時,它不會在文件中追加數據。我已經在上面添加了我的代碼。 Plz告訴我我做錯了什麼? – 2013-04-29 02:36:08

+0

傳感器值是否顯示在LogCat中?你應該使用'Log.d()'而不是'System.out'。我的代碼中沒有看到明顯的錯誤。在'onSensorChanged'中添加else case以確保'start'值正確設置爲'true'會很有幫助 – iTech 2013-04-29 06:48:57

+1

我的手機同步存在問題,它沒有顯示新數據。有用。感謝幫助。 – 2013-05-01 02:36:26