package com.google.mcommerce.sample.android.chapter08.sensor; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Environment; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.provider.Settings; import android.util.Log; import com.google.mcommerce.sample.android.R; public class AccelerometerRecordToFileActivity extends Activity implements SensorEventListener { private static final String TAG = "AccelerometerRecordToFile"; private WakeLock mWakelock = null; private SensorManager mMgr; private Sensor mAccel; private BufferedWriter mLog; final private SimpleDateFormat mTimeFormat = new SimpleDateFormat( "HH:mm:ss - "); private int mSavedTimeout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c08_sensor_accelerometer_record_file); mMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); mAccel = mMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // Setup the log file to write to. We will append it just in case this // activity restarts in the middle of our experiment. try { String filename = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/accel.log"; mLog = new BufferedWriter(new FileWriter(filename, true)); } catch (Exception e) { Log.e(TAG, "Unable to initialize the logfile"); e.printStackTrace(); finish(); } PowerManager pwrMgr = (PowerManager) this .getSystemService(POWER_SERVICE); mWakelock = pwrMgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Accel"); mWakelock.acquire(); // Save the current value of the screen timeout, then set it to 5 // seconds try { mSavedTimeout = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT); } catch (Exception e) { mSavedTimeout = 120000; // 2 minutes } Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 5000); // 5 seconds } public BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { writeLog("The screen has turned off"); // Unregisters the listener and registers it again. mMgr.unregisterListener(AccelerometerRecordToFileActivity.this); mMgr.registerListener(AccelerometerRecordToFileActivity.this, mAccel, SensorManager.SENSOR_DELAY_NORMAL); } } }; @Override protected void onStart() { writeLog("starting..."); mMgr.registerListener(this, mAccel, SensorManager.SENSOR_DELAY_NORMAL); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mReceiver, filter); super.onStart(); } @Override protected void onStop() { writeLog("stopping..."); mMgr.unregisterListener(this, mAccel); unregisterReceiver(mReceiver); try { mLog.flush(); } catch (IOException e) { // ignore any errors with the logfile } super.onStop(); } @Override protected void onDestroy() { writeLog("shutting down..."); try { mLog.flush(); mLog.close(); } catch (Exception e) { // ignore any errors with the logfile } // Restore the screen off timeout to the previous value Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, mSavedTimeout); mWakelock.release(); super.onDestroy(); } public void onAccuracyChanged(Sensor sensor, int accuracy) { // ignore } public void onSensorChanged(SensorEvent event) { writeLog("Got a sensor event: " + event.values[0] + ", " + event.values[1] + ", " + event.values[2]); } private void writeLog(String str) { try { Date now = new Date(); mLog.write(mTimeFormat.format(now)); mLog.write(str); mLog.write("\n"); } catch (IOException ioe) { ioe.printStackTrace(); } } }