【问题标题】:Android save stream data of Accelecrometer and Gryo log to text fileAndroid将加速度计和陀螺仪日志的流数据保存到文本文件
【发布时间】:2016-08-08 10:10:53
【问题描述】:

我正在尝试记录加速度计和 gro 数据并将其保存在文本或 csv 文件中以供分析,虽然我能够在 中流式传输数据,但不知道如何将日志信息保存在文本文件中.

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.mbientlab.metawear.AsyncOperation;
import com.mbientlab.metawear.Message;
import com.mbientlab.metawear.MetaWearBleService;
import com.mbientlab.metawear.MetaWearBoard;
import com.mbientlab.metawear.RouteManager;
import com.mbientlab.metawear.UnsupportedModuleException;
import com.mbientlab.metawear.data.CartesianFloat;
import com.mbientlab.metawear.module.Accelerometer;
import com.mbientlab.metawear.module.Debug;
import com.mbientlab.metawear.module.Gyro;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements ServiceConnection ,Runnable{

    private static final String LOG_TAG1="A",LOG_TAG="G",   ACCEL_DATA="accel_data",GYRO_DATA="gyro_data";
    private MetaWearBleService.LocalBinder serviceBinder;
    private MetaWearBoard mwBoard;
    private Accelerometer accelModule;
    private Gyro gyroModule;
    private Debug debugModule;

    private String filename = "MySampleFile.txt";
    private String filepath = "MyFileStorage";
    File myInternalFile;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getApplicationContext().bindService(new Intent(this, MetaWearBleService.class), this, Context.BIND_AUTO_CREATE);

        ContextWrapper contextWrapper=new ContextWrapper(getApplicationContext());
        File directory=contextWrapper.getDir(filepath,Context.MODE_PRIVATE);
        if(!directory.exists()){
            directory.mkdir();
        }
        myInternalFile=new File(directory,filename);

//Start the Thread//
        findViewById(R.id.start_accel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                t1.start();
                t2.start();
            }

        });
//Stop Streaming Accelerometer and Gyro//

    findViewById(R.id.stop_accel).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            accelModule.stop();
            gyroModule.stop();
        }
    });


        findViewById(R.id.reset_accel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                debugModule.resetDevice();
            }
        });

//Save log file, Create a folder in internal storage//
        findViewById(R.id.save_data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    FileOutputStream fos= new FileOutputStream(myInternalFile);
                    fos.write(LOG_TAG1.getBytes());
                    fos.close();
                    Toast.makeText(getApplicationContext(), "record saved", Toast.LENGTH_LONG).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        });
    }
//Unbinding Bluetooth//
    @Override
    public void onDestroy(){
        super.onDestroy();
        getApplicationContext().unbindService(this);
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        serviceBinder = (MetaWearBleService.LocalBinder)service;

        final String mwMacAdress= "F7:31:B8:53:9C:8F";
        BluetoothManager btManager=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        BluetoothDevice btDeveice= btManager.getAdapter().getRemoteDevice(mwMacAdress);

        mwBoard=serviceBinder.getMetaWearBoard(btDeveice);
        mwBoard.setConnectionStateHandler(new MetaWearBoard.ConnectionStateHandler() {
            @Override
            public void connected() {
                super.connected();
                Log.i(LOG_TAG,"Connected");

                try {
                    accelModule = mwBoard.getModule(Accelerometer.class);
                    accelModule.setAxisSamplingRange(2.f);
                    accelModule.setOutputDataRate(50.f);
                    accelModule.routeData().fromAxes().stream(ACCEL_DATA).commit()
                            .onComplete(new AsyncOperation.CompletionHandler<RouteManager>() {
                                @Override
                                public void success(RouteManager result) {
                                    result.subscribe(ACCEL_DATA, new RouteManager.MessageHandler() {
                                        @Override
                                        public void process(Message message) {
                                            Log.i(LOG_TAG1, message.getData(CartesianFloat.class).toString());

                                        }
                                    });
                                }
                            });
                    debugModule=mwBoard.getModule(Debug.class);
                } catch (UnsupportedModuleException e) {
                    Log.i(LOG_TAG,"cannot find module",e);

                }
                try {
                    gyroModule=mwBoard.getModule(Gyro.class);
                    gyroModule.setAngularRateRange(125.f);
                    gyroModule.setOutputDataRate(25.f);
                    gyroModule.routeData().fromAxes().stream(GYRO_DATA).commit()
                            .onComplete(new AsyncOperation.CompletionHandler<RouteManager>() {
                                @Override
                                public void success(RouteManager result) {
                                    result.subscribe(GYRO_DATA, new RouteManager.MessageHandler() {
                                        @Override
                                        public void process(Message message) {
                                             Log.i(LOG_TAG, message.getData(CartesianFloat.class).toString());
                                        }
                                    });
                                }
                            });
                    debugModule=mwBoard.getModule(Debug.class);

                } catch (UnsupportedModuleException e){
                    Log.i(LOG_TAG,"cannot find module", e);
                }
            }

            @Override
            public void disconnected() {
                Log.i(LOG_TAG,"Disconnected");
            }
        });
        mwBoard.connect();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
//Threading //
    public void run() {
    }
    Thread t1 = new Thread() {
        public void run() {
            try {
                accelModule.enableAxisSampling();
                accelModule.start();
            } catch (Exception e) {
            }
        }

};
    Thread t2 = new Thread() {
        public void run() {
            try {
                gyroModule.start();
            }catch (Exception e){}
        }
    };

【问题讨论】:

  • 这个答案可能会在“如何追加文件”方面指导您正确的方向:stackoverflow.com/questions/4542318/android-append-text-file
  • 感谢@NicolasSimon。我从链接中了解到我需要将我的日志文件附加到文本文件中。
  • @NicolasSimon 我从链接中了解到我需要在文本文件中append 我的日志文件。我可以告诉你,我是 Java 的新手,并且努力将我的 log.i 存储在一个变量中,以便我可以在 osw.append() 中使用

标签: log.i java android


【解决方案1】:

首先,创建一个将字符串附加到文件的函数,例如:

private void appendToFile(String str) {
  File file = getFileStreamPath("test.txt");
  if (!file.exists()) {
    file.createNewFile();
  }
  FileOutputStream writer = openFileOutput(file.getName(), MODE_APPEND | MODE_WORLD_READABLE);
  writer.write(str.getBytes());
  writer.flush();
  writer.close();
}

现在,而不是调用

Log.i(LOG_TAG, message.getData(CartesianFloat.class).toString());

只需调用:

appendToFile(message.getData(CartesianFloat.class).toString());

或者您想在文件中存储的任何其他信息

【讨论】:

  • 谢谢,这正是我所需要的。
  • 我可以将加速度计和陀螺仪保存在两个单独的文件中。但只能通过adbshell 访问它们,您能否建议一些方法,通过将我的手机与 USB 连接,我可以将文件保存在内部存储中并访问。请注意,我的手机不支持外部 SD 卡。
  • 数据将每 20 毫秒输入一次......我不确定经常打开和关闭流是否有意义......它的开销很大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2010-12-07
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多