java - Android 应用程序 - 将传感器数据保存到本地文件
问题描述
我正在做一个项目来记录来自加速度传感器(xyz)的数据并将其保存到我手机上的文件中。我找到了一个代码片段,它从连接的传感器中检索数据,但没有将其保存在找到的传感器上。不幸的是,我根本不了解 Java,所以我希望这里有人提示要添加什么来实现节省部分。我假设我需要不断地将来自 onSensorChanged 的变量(变量 accx、accy、acz)附加到一个对象,然后在我停止录制时保存它。
编辑:我声明了以下数组列表。3个用于我的传感器数据,一个用于写入相应的时间戳。
final ArrayList<Integer> arrlist_ts = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_x = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_y = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_z = new ArrayList<Integer>(5);
我将添加到数组的命令放在变量 String out_text 之后的 run() 函数中。
然后,我将字符串连接放在 if (timer1 != null) 条件下的函数 stopRecording() 中。那有意义吗?然后我会将代码保存到同一位置的文件中。
这是代码
package pervasive_recorder;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.ArrayList;
import android.os.Handler;
import android.os.Message;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Binder;
import android.os.IBinder;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;
public class ARFFRecorderService extends Service implements SensorEventListener {
private int NOTIFICATION = R.string.recording;
private final IBinder mBinder = new LocalBinder();
private NotificationManager mNM;
private boolean recording = false;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private ARFFRecorderActivity clientActivity = null;
private int ts, accx, accy, accz;
static Timer timer1 = null;
final ArrayList<Integer> arrlist_ts = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_x = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_y = new ArrayList<Integer>(5);
final ArrayList<Integer> arrlist_z = new ArrayList<Integer>(5);
public class LocalBinder extends Binder {
ARFFRecorderService getService() {
return ARFFRecorderService.this;
}
}
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (clientActivity != null) clientActivity.updateAccStatus("Callback handler");
return true;
}
});
public void setClientActivity(ARFFRecorderActivity clientActivity) {
this.clientActivity = clientActivity;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (clientActivity.disp_rate > 0) {
timer1 = new Timer();
timer1.schedule(new TimerTask() {
@Override
public void run() {
String out_text = "acc x = " + accx + " y = " + accy + " z = " + accz;
arrlist_ts.add(ts);
arrlist_x.add(accx);
arrlist_y.add(accy);
arrlist_z.add(accz);
if (clientActivity != null) clientActivity.updateAccStatus(out_text);
}
}, 1000, (int) (1000 / clientActivity.disp_rate));
}
if (!recording) {
recording = true;
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getText(R.string.app_name))
.setContentText(getText(R.string.recording));
Intent resultIntent = new Intent(this, ARFFRecorderActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ARFFRecorderActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mNM.notify(NOTIFICATION, mBuilder.build());
mSensorManager.registerListener(this, mAccelerometer, clientActivity.samp_rate);
if (clientActivity != null) clientActivity.updateAccStatus("acc started");
}
return START_STICKY;
}
public void onSensorChanged(SensorEvent e) {
ts = (int) (new Date().getTime()/1000);
accx = (int) (100000 * e.values[0]);
accy = (int) (100000 * e.values[1]);
accz = (int) (100000 * e.values[2]);
}
private void showMessage(String text) {
Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG);
toast.show();
}
@Override
public void onDestroy() {
stopRecording();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public boolean isRecording() {
return recording;
}
public void stopRecording() {
if (recording) {
mSensorManager.unregisterListener(this);
mNM.cancel(NOTIFICATION);
recording = false;
if (timer1 != null) {
String s_ts = "";
String s_x = "";
String s_y = "";
String s_z = "";
StringBuilder sb_ts = new StringBuilder();
for (int i = 0; i < arrlist_ts.size(); i++) {
sb_ts.append(arrlist_ts.get(i));
}
StringBuilder sb_x = new StringBuilder();
for (int i = 0; i < arrlist_x.size(); i++) {
sb_x.append(arrlist_x.get(i));
}
StringBuilder sb_y = new StringBuilder();
for (int i = 0; i < arrlist_ts.size(); i++) {
sb_y.append(arrlist_y.get(i));
}
StringBuilder sb_z = new StringBuilder();
for (int i = 0; i < arrlist_ts.size(); i++) {
sb_z.append(arrlist_z.get(i));
}
s_ts = sb_ts.toString();
s_x = sb_x.toString();
s_y = sb_y.toString();
s_z = sb_z.toString();
timer1.cancel();
}
if (clientActivity != null) clientActivity.updateAccStatus("acc stopped");
stopSelf();
}
}
}
解决方案
在这里,您有一些DOC,其中包含用于存储数据的所有选项,也许SharedPreferences会更好/更容易实现?
如果你真的需要存储/sd 卡上的文件,请查看THIS SO question and answers,还有一个关于这种方式的官方文档部分
推荐阅读
- r - 如何避免ggplot错误:“美学必须是长度1或与数据相同(84):x,y”?
- excel - 复制符合条件的特定单元格并粘贴到另一个工作表
- c++ - 强制解析 MSVC 中的多个函数定义
- javascript - 在多部分请求Node js中动态创建文件夹并上传文件
- alexa - Alexa Skill - 动态调用名称
- arduino - 中断例程不能处理向数组添加变量吗?
- angular - 您的全局 Angular CLI 版本 (6.1.2) 高于本地版本 (1.5.0)。使用本地 Angular CLI 版本?
- java - java jdbc中的更新查询给出运行时错误
- javascript - padStart() 在 IE11 中不起作用
- android - 启动新项目时如何更改默认依赖项实现