Android应用程序 – 将传感器数据保存到本地文件

huangapple go评论101阅读模式
英文:

Android app - save sensor data to local file

问题

  1. package pervasive_recorder;
  2. import java.util.Date;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5. import java.util.ArrayList;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.app.NotificationManager;
  9. import android.app.PendingIntent;
  10. import android.app.Service;
  11. import android.content.Intent;
  12. import android.hardware.Sensor;
  13. import android.hardware.SensorEvent;
  14. import android.hardware.SensorEventListener;
  15. import android.hardware.SensorManager;
  16. import android.os.Binder;
  17. import android.os.IBinder;
  18. import android.support.v4.app.TaskStackBuilder;
  19. import android.support.v4.app.NotificationCompat;
  20. import android.widget.Toast;
  21. public class ARFFRecorderService extends Service implements SensorEventListener {
  22. private int NOTIFICATION = R.string.recording;
  23. private final IBinder mBinder = new LocalBinder();
  24. private NotificationManager mNM;
  25. private boolean recording = false;
  26. private SensorManager mSensorManager;
  27. private Sensor mAccelerometer;
  28. private ARFFRecorderActivity clientActivity = null;
  29. private int ts, accx, accy, accz;
  30. static Timer timer1 = null;
  31. final ArrayList<Integer> arrlist_ts = new ArrayList<Integer>(5);
  32. final ArrayList<Integer> arrlist_x = new ArrayList<Integer>(5);
  33. final ArrayList<Integer> arrlist_y = new ArrayList<Integer>(5);
  34. final ArrayList<Integer> arrlist_z = new ArrayList<Integer>(5);
  35. public class LocalBinder extends Binder {
  36. ARFFRecorderService getService() {
  37. return ARFFRecorderService.this;
  38. }
  39. }
  40. @Override
  41. public void onCreate() {
  42. mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  43. mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  44. mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  45. }
  46. private Handler handler = new Handler(new Handler.Callback() {
  47. @Override
  48. public boolean handleMessage(Message msg) {
  49. if (clientActivity != null) clientActivity.updateAccStatus("Callback handler");
  50. return true;
  51. }
  52. });
  53. public void setClientActivity(ARFFRecorderActivity clientActivity) {
  54. this.clientActivity = clientActivity;
  55. }
  56. @Override
  57. public int onStartCommand(Intent intent, int flags, int startId) {
  58. if (clientActivity.disp_rate > 0) {
  59. timer1 = new Timer();
  60. timer1.schedule(new TimerTask() {
  61. @Override
  62. public void run() {
  63. String out_text = "acc x = " + accx + " y = " + accy + " z = " + accz;
  64. arrlist_ts.add(ts);
  65. arrlist_x.add(accx);
  66. arrlist_y.add(accy);
  67. arrlist_z.add(accz);
  68. if (clientActivity != null) clientActivity.updateAccStatus(out_text);
  69. }
  70. }, 1000, (int) (1000 / clientActivity.disp_rate));
  71. }
  72. if (!recording) {
  73. recording = true;
  74. NotificationCompat.Builder mBuilder =
  75. new NotificationCompat.Builder(this)
  76. .setSmallIcon(R.mipmap.ic_launcher)
  77. .setContentTitle(getText(R.string.app_name))
  78. .setContentText(getText(R.string.recording));
  79. Intent resultIntent = new Intent(this, ARFFRecorderActivity.class);
  80. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
  81. stackBuilder.addParentStack(ARFFRecorderActivity.class);
  82. stackBuilder.addNextIntent(resultIntent);
  83. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
  84. mBuilder.setContentIntent(resultPendingIntent);
  85. mNM.notify(NOTIFICATION, mBuilder.build());
  86. mSensorManager.registerListener(this, mAccelerometer, clientActivity.samp_rate);
  87. if (clientActivity != null) clientActivity.updateAccStatus("acc started");
  88. }
  89. return START_STICKY;
  90. }
  91. public void onSensorChanged(SensorEvent e) {
  92. ts = (int) (new Date().getTime()/1000);
  93. accx = (int) (100000 * e.values[0]);
  94. accy = (int) (100000 * e.values[1]);
  95. accz = (int) (100000 * e.values[2]);
  96. }
  97. private void showMessage(String text) {
  98. Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG);
  99. toast.show();
  100. }
  101. @Override
  102. public void onDestroy() {
  103. stopRecording();
  104. }
  105. @Override
  106. public IBinder onBind(Intent intent) {
  107. return mBinder;
  108. }
  109. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  110. }
  111. public boolean isRecording() {
  112. return recording;
  113. }
  114. public void stopRecording() {
  115. if (recording) {
  116. mSensorManager.unregisterListener(this);
  117. mNM.cancel(NOTIFICATION);
  118. recording = false;
  119. if (timer1 != null) {
  120. String s_ts = "";
  121. String s_x = "";
  122. String s_y = "";
  123. String s_z = "";
  124. StringBuilder sb_ts = new StringBuilder();
  125. for (int i = 0; i < arrlist_ts.size(); i++) {
  126. sb_ts.append(arrlist_ts.get(i));
  127. }
  128. StringBuilder sb_x = new StringBuilder();
  129. for (int i = 0; i < arrlist_x.size(); i++) {
  130. sb_x.append(arrlist_x.get(i));
  131. }
  132. StringBuilder sb_y = new StringBuilder();
  133. for (int i = 0; i < arrlist_ts.size(); i++) {
  134. sb_y.append(arrlist_y.get(i));
  135. }
  136. StringBuilder sb_z = new StringBuilder();
  137. for (int i = 0; i < arrlist_ts.size(); i++) {
  138. sb_z.append(arrlist_z.get(i));
  139. }
  140. s_ts = sb_ts.toString();
  141. s_x = sb_x.toString();
  142. s_y = sb_y.toString();
  143. s_z = sb_z.toString();
  144. timer1.cancel();
  145. }
  146. if (clientActivity != null) clientActivity.updateAccStatus("acc stopped");
  147. stopSelf();
  148. }
  149. }
  150. }
英文:

I'm doing a project to record data from an accelerometer sensor (xyz) and save it to a file on my phone. I found a code snippet which retrieves the data from the connected sensor but doesnt save it on the found. Unfortunately I dont know Java at all so I was hoping someone here a tip what to add to achive the saving part. I assume I need to continuously append the variables from onSensorChanged (variables accx, accy, accz) to a object and then save it when I stop recording.

EDIT:
I declared the following array lists. 3 for my sensor data and one to write the corresponding timestamps.

  1. final ArrayList&lt;Integer&gt; arrlist_ts = new ArrayList&lt;Integer&gt;(5);
  2. final ArrayList&lt;Integer&gt; arrlist_x = new ArrayList&lt;Integer&gt;(5);
  3. final ArrayList&lt;Integer&gt; arrlist_y = new ArrayList&lt;Integer&gt;(5);
  4. final ArrayList&lt;Integer&gt; arrlist_z = new ArrayList&lt;Integer&gt;(5);

I placed the add-to-array commands in the run() function right after the variable String out_text.

I then put the string concatenation in the function stopRecording() in the if (timer1 != null) condition. Does that make sense?
I would then put the code to save the strings to a file at the same location.

Here is the code

  1. package pervasive_recorder;
  2. import java.util.Date;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5. import java.util.ArrayList;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.app.NotificationManager;
  9. import android.app.PendingIntent;
  10. import android.app.Service;
  11. import android.content.Intent;
  12. import android.hardware.Sensor;
  13. import android.hardware.SensorEvent;
  14. import android.hardware.SensorEventListener;
  15. import android.hardware.SensorManager;
  16. import android.os.Binder;
  17. import android.os.IBinder;
  18. import android.support.v4.app.TaskStackBuilder;
  19. import android.support.v4.app.NotificationCompat;
  20. import android.widget.Toast;
  21. public class ARFFRecorderService extends Service implements SensorEventListener {
  22. private int NOTIFICATION = R.string.recording;
  23. private final IBinder mBinder = new LocalBinder();
  24. private NotificationManager mNM;
  25. private boolean recording = false;
  26. private SensorManager mSensorManager;
  27. private Sensor mAccelerometer;
  28. private ARFFRecorderActivity clientActivity = null;
  29. private int ts, accx, accy, accz;
  30. static Timer timer1 = null;
  31. final ArrayList&lt;Integer&gt; arrlist_ts = new ArrayList&lt;Integer&gt;(5);
  32. final ArrayList&lt;Integer&gt; arrlist_x = new ArrayList&lt;Integer&gt;(5);
  33. final ArrayList&lt;Integer&gt; arrlist_y = new ArrayList&lt;Integer&gt;(5);
  34. final ArrayList&lt;Integer&gt; arrlist_z = new ArrayList&lt;Integer&gt;(5);
  35. public class LocalBinder extends Binder {
  36. ARFFRecorderService getService() {
  37. return ARFFRecorderService.this;
  38. }
  39. }
  40. @Override
  41. public void onCreate() {
  42. mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  43. mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  44. mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  45. }
  46. private Handler handler = new Handler(new Handler.Callback() {
  47. @Override
  48. public boolean handleMessage(Message msg) {
  49. if (clientActivity != null) clientActivity.updateAccStatus(&quot;Callback handler&quot;);
  50. return true;
  51. }
  52. });
  53. public void setClientActivity(ARFFRecorderActivity clientActivity) {
  54. this.clientActivity = clientActivity;
  55. }
  56. @Override
  57. public int onStartCommand(Intent intent, int flags, int startId) {
  58. if (clientActivity.disp_rate &gt; 0) {
  59. timer1 = new Timer();
  60. timer1.schedule(new TimerTask() {
  61. @Override
  62. public void run() {
  63. String out_text = &quot;acc x = &quot; + accx + &quot; y = &quot; + accy + &quot; z = &quot; + accz;
  64. arrlist_ts.add(ts);
  65. arrlist_x.add(accx);
  66. arrlist_y.add(accy);
  67. arrlist_z.add(accz);
  68. if (clientActivity != null) clientActivity.updateAccStatus(out_text);
  69. }
  70. }, 1000, (int) (1000 / clientActivity.disp_rate));
  71. }
  72. if (!recording) {
  73. recording = true;
  74. NotificationCompat.Builder mBuilder =
  75. new NotificationCompat.Builder(this)
  76. .setSmallIcon(R.mipmap.ic_launcher)
  77. .setContentTitle(getText(R.string.app_name))
  78. .setContentText(getText(R.string.recording));
  79. Intent resultIntent = new Intent(this, ARFFRecorderActivity.class);
  80. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
  81. stackBuilder.addParentStack(ARFFRecorderActivity.class);
  82. stackBuilder.addNextIntent(resultIntent);
  83. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
  84. mBuilder.setContentIntent(resultPendingIntent);
  85. mNM.notify(NOTIFICATION, mBuilder.build());
  86. mSensorManager.registerListener(this, mAccelerometer, clientActivity.samp_rate);
  87. if (clientActivity != null) clientActivity.updateAccStatus(&quot;acc started&quot;);
  88. }
  89. return START_STICKY;
  90. }
  91. public void onSensorChanged(SensorEvent e) {
  92. ts = (int) (new Date().getTime()/1000);
  93. accx = (int) (100000 * e.values[0]);
  94. accy = (int) (100000 * e.values[1]);
  95. accz = (int) (100000 * e.values[2]);
  96. }
  97. private void showMessage(String text) {
  98. Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG);
  99. toast.show();
  100. }
  101. @Override
  102. public void onDestroy() {
  103. stopRecording();
  104. }
  105. @Override
  106. public IBinder onBind(Intent intent) {
  107. return mBinder;
  108. }
  109. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  110. }
  111. public boolean isRecording() {
  112. return recording;
  113. }
  114. public void stopRecording() {
  115. if (recording) {
  116. mSensorManager.unregisterListener(this);
  117. mNM.cancel(NOTIFICATION);
  118. recording = false;
  119. if (timer1 != null) {
  120. String s_ts = &quot;&quot;;
  121. String s_x = &quot;&quot;;
  122. String s_y = &quot;&quot;;
  123. String s_z = &quot;&quot;;
  124. StringBuilder sb_ts = new StringBuilder();
  125. for (int i = 0; i &lt; arrlist_ts.size(); i++) {
  126. sb_ts.append(arrlist_ts.get(i));
  127. }
  128. StringBuilder sb_x = new StringBuilder();
  129. for (int i = 0; i &lt; arrlist_x.size(); i++) {
  130. sb_x.append(arrlist_x.get(i));
  131. }
  132. StringBuilder sb_y = new StringBuilder();
  133. for (int i = 0; i &lt; arrlist_ts.size(); i++) {
  134. sb_y.append(arrlist_y.get(i));
  135. }
  136. StringBuilder sb_z = new StringBuilder();
  137. for (int i = 0; i &lt; arrlist_ts.size(); i++) {
  138. sb_z.append(arrlist_z.get(i));
  139. }
  140. s_ts = sb_ts.toString();
  141. s_x = sb_x.toString();
  142. s_y = sb_y.toString();
  143. s_z = sb_z.toString();
  144. timer1.cancel();
  145. }
  146. if (clientActivity != null) clientActivity.updateAccStatus(&quot;acc stopped&quot;);
  147. stopSelf();
  148. }
  149. }
  150. }

答案1

得分: 1

这里有一些文档,涵盖了存储数据的所有选项,也许使用SharedPreferences(共享首选项)会更好/更容易实现?

如果你真的需要在存储/SD卡上的文件,那么可以查看这个栈溢出的问题和答案,还有一个官方的文档章节介绍了这种方法。

英文:

here you have some DOC with all options for storing data, maybe SharedPreferences would be better/easier to implement?

if you really need a file on storage/sd card then check out THIS SO question and answers, there is also an official DOC section about this way

huangapple
  • 本文由 发表于 2020年10月17日 16:50:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/64400649.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定