cwhe10的个人博客分享 http://blog.sciencenet.cn/u/cwhe10

博文

0062:Android开发手机传感器数据读取并保存APP(攻博记)

已有 9724 次阅读 2018-4-11 16:57 |个人分类:科学研究|系统分类:科研笔记| 安卓;传感器;APP

开发APP主要注意点(AS版本号2.3.3):


  1. 使用jxl读取操作excel文件:

  2. 权限代码在AndroidManifest.xml文件下的package代码下添加读取权限:

1.png

3.程序主要代码(MainActivity.java):

package myapplication.sensors_all;


import android.app.Activity;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;


import java.io.File;

import java.util.ArrayList;

import java.util.Timer;

import java.util.TimerTask;


import jxl.Sheet;

import jxl.Workbook;

import jxl.write.Label;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;


public class MainActivity extends Activity //implements SensorEventListener 最初是SensorListener

{

    private SensorManager mSensorManager;

    private String excelPath;//文件存储路径

    Timer timer=null;

    TextView etGyro;

    TextView etMagnetic;

    TextView etLinearAcc;

    EditText inputfilename;//文件名输入框

    Button start;

    Button stop;

    float flag=0;

    ArrayList <Float> AccList=new ArrayList<Float>();

    ArrayList <Float> GyrList=new ArrayList<Float>();

    ArrayList <Float> MagList=new ArrayList<Float>();

    private float AccData[]=new float[3];

    private float GyrData[]=new float[3];

    private float MagData[]=new float[3];

    private Workbook wb;

    private WritableWorkbook wbook;//需要导入jxl工程或者包

    private WritableSheet sh;

    private Sheet sheet;

    CreateXls data_XLS=new CreateXls();//需要导入工程或者jxl包


    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        start=(Button)findViewById(R.id.bn1);

        stop=(Button)findViewById(R.id.bn2);

        etGyro=(TextView)findViewById(R.id.etGyro);

        etLinearAcc=(TextView)findViewById(R.id.etLinearAcc);

        etMagnetic=(TextView)findViewById(R.id.etMagnetic);

        inputfilename=(EditText)findViewById(R.id.filename);


        mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);

        start.setOnClickListener(myListner);//为开始按钮和停止按钮添加监听器

        stop.setOnClickListener(myListner);

    }

    //开始和结束按钮监听器的外部实现

    private Button.OnClickListener myListner=new Button.OnClickListener()

    {

        @Override

        public void onClick(View v)

        {

            switch(v.getId())

            {

                case R.id.bn1:  //开始按钮

                    StartSensorListening();//启动传感数据采集(注册三个传感器)

                    if (inputfilename.getText().toString().equals(""))

                    {

                        StopSensorListening();//传感器失效

                        break;

                    }

                    //在SDcard给定路径下创建文件

                    excelPath=data_XLS.getExcelDir()+ File.separator+

                            inputfilename.getText().toString()+".xls";

                    Log.d("CC",excelPath);

                    data_XLS.excelCreate(new File(excelPath));

                    if (timer == null) {timer = new Timer();}

                    timer.schedule(new TimerTask()

                    {

                        @Override

                        public void run() {

                            if  (0==flag)

                            {

                                AccList.add(AccData[0]);AccList.add(AccData[1]);

                                AccList.add(AccData[2]);GyrList.add(GyrData[0]);

                                GyrList.add(GyrData[1]);GyrList.add(GyrData[2]);

                                MagList.add(MagData[0]);MagList.add(MagData[1]);

                                MagList.add(MagData[2]);

                            }

                        }

                    },10,50);   //10ms后开始采集,每隔20ms采集一次

                    inputfilename.setEnabled(false);//数据一旦开始采集,不允许输入文件名

                    stop.setEnabled(true);//关闭按钮启用

                    start.setEnabled(false);//开始按钮失效

                    break;

                case R.id.bn2:

                    StopSensorListening();//停止传感器采集

                    timer.cancel();//退出采集任务

                    timer=null;

                    inputfilename.setEnabled(true);

                    start.setEnabled(true);

                    stop.setEnabled(false);

                    WriteXls(AccList,GyrList,MagList);//核心代码:将采集的数据写入文件中

                    AccList.clear();//清除链表数据

                    GyrList.clear();

                    MagList.clear();

                    break;

            }

        }

    };


    /*@Override

    protected void onStop()

    {

        mSensorManager.unregisterListener(this);

        super.onStop();

    }

    @Override

    protected void onPause()

    {

        mSensorManager.unregisterListener(this);

        super.onPause();

    }

    @Override

    public void onAccuracyChanged(Sensor snesor,int accuracy){ }*/


    private SensorEventListener listener =new SensorEventListener()

    {

        @Override

        public void onAccuracyChanged(Sensor sensor, int i) {

            //// TODO: 2018-4-8

        }


        public void onSensorChanged(SensorEvent e)

        {

            StringBuilder sb=null;

            switch (e.sensor.getType()) {

                case Sensor.TYPE_GYROSCOPE:     //陀螺传感器

                    sb = new StringBuilder();

                    sb.append("绕X轴转过的角速度:");

                    sb.append(e.values[0]);

                    sb.append("\n绕Y轴转过的角速度:");

                    sb.append(e.values[1]);

                    sb.append("\n绕Z轴转过的角速度:");

                    sb.append(e.values[2]);

                    etGyro.setText(sb.toString());

                    GyrData[0] = e.values[0];

                    GyrData[1] = e.values[1];

                    GyrData[2] = e.values[2];

                    break;

                case Sensor.TYPE_MAGNETIC_FIELD:    //磁场传感器

                    sb = new StringBuilder();

                    sb.append("绕X轴-磁场:");

                    sb.append(e.values[0]);

                    sb.append("\n绕Y轴-磁场:");

                    sb.append(e.values[1]);

                    sb.append("\n绕Z轴-磁场:");

                    sb.append(e.values[2]);

                    etMagnetic.setText(sb.toString());

                    MagData[0] = e.values[0];

                    MagData[1] = e.values[1];

                    MagData[2] = e.values[2];

                    break;

                case Sensor.TYPE_ACCELEROMETER:   //加速度传感器

                    sb = new StringBuilder();

                    sb.append("X轴-加速度:");

                    sb.append(e.values[0]);

                    sb.append("\nY轴-加速度:");

                    sb.append(e.values[1]);

                    sb.append("\nZ轴-加速度:");

                    sb.append(e.values[2]);

                    etLinearAcc.setText(sb.toString());

                    AccData[0] = e.values[0];

                    AccData[1] = e.values[1];

                    AccData[2] = e.values[2];

                    break;

            }

        }

    };


    public void WriteXls(ArrayList<Float> accdata,ArrayList<Float> gyrdata,

                         ArrayList<Float> magdata)

    {

        try {

            wb=Workbook.getWorkbook(new File(excelPath));//获取原始文档

            sheet=wb.getSheet(0);//得到一个工作对象

            wbook=Workbook.createWorkbook(new File(excelPath),wb);//根据book创建一个操作对象

            sh=wbook.getSheet(0);//得到一个工作

            //逐个写入加速度数据到文件中去!

            for(int i=0,acc_Row=1;i<accdata.size();)

            {

                if  (accdata!=null && accdata.get(i)!=null)

                {

                    for(int j=0;j<3;j++)

                    {

                        Label label=new Label(j,acc_Row,String.valueOf(accdata.get(i)));

                        sh.addCell(label);

                        i++;

                    }

                    acc_Row++;

                }

            }

            //逐个写入陀螺数据到文件中去!

            for(int i=0,gyr_Row=1;i<gyrdata.size();)

            {

                if  (gyrdata!=null && gyrdata.get(i)!=null)

                {

                    for(int j=3;j<6;j++)

                    {

                        Label label=new Label(j,gyr_Row,String.valueOf(gyrdata.get(i)));

                        sh.addCell(label);

                        i++;

                    }

                    gyr_Row++;

                }

            }

            //逐个写入磁力计数据到文件中去!

            for(int i=0,mag_Row=1;i<magdata.size();)

            {

                if  (magdata!=null && magdata.get(i)!=null)

                {

                    for(int j=6;j<9;j++)

                    {

                        Label label=new Label(j,mag_Row,String.valueOf(magdata.get(i)));

                        sh.addCell(label);

                        i++;

                    }

                    mag_Row++;

                }

            }

            //写入数据

            wbook.write();

            wbook.close();

        } catch (Exception e2){

            System.out.print(e2.toString()+"--");

            System.out.print("--异常--");

        }

    }


    public void StartSensorListening()

    {

        //super.onResume();

        //陀螺传感器注册监听器

        mSensorManager.registerListener(listener,mSensorManager.getDefaultSensor(

                Sensor.TYPE_GYROSCOPE),SensorManager.SENSOR_DELAY_FASTEST);

        //磁场传感器注册监听器

        mSensorManager.registerListener(listener,mSensorManager.getDefaultSensor(

                Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);

        //加速度传感器注册监听器

        mSensorManager.registerListener(listener,mSensorManager.getDefaultSensor(

                Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST);

    }

    public void StopSensorListening()

    {

        mSensorManager.unregisterListener(listener);

    }

}

4.CreateXls.java代码:

package myapplication.sensors_all;


import android.os.Environment;

import android.util.Log;


import java.io.File;


import jxl.Workbook;

import jxl.write.Label;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;


public class CreateXls {


private WritableWorkbook wwb;


//创建EXCEL文件

public  WritableWorkbook excelCreate(File file) {

// 准备设置excel工作表的标题-cwhe修改:2018-4-10

String[] title = {"ACCx/mg","ACCy/mg","ACCz/mg","GYROx/m°","GYROy/m°","GYROz/m°","Magx/mT","Magy/mT","Magz/mT"};

//String[] title = {"ACCx/mg","ACCy/mg","ACCz/mg","GYROx/m°","GYROy/m°","GYROz/m°","Magx/mT","Magy/mT","Magz/mT","Time/ms"};

WritableSheet ws = null;

try {

// OutputStream os = new FileOutputStream(excelPath);

// 创建Excel工作薄

wwb = Workbook.createWorkbook(file);

// 添加第一个工作表并设置第一个Sheet的名字

ws = wwb.createSheet("mysheet", 0);

Label label;

for(int i=0;i<title.length;i++)

{

// Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y

// 在Label对象的子对象中指明单元格的位置和内容

label = new Label(i,0,title[i]);

// 将定义好的单元格添加到工作表中

ws.addCell(label);

}

// 写入数据

wwb.write();

// 关闭文件

wwb.close();


} catch (Exception e) {

e.printStackTrace();

}

return wwb;

}


public String getExcelDir() {

// SD卡指定文件夹

String sdcardPath = Environment.getExternalStorageDirectory()

.toString();

File dir = new File(sdcardPath + File.separator + "MeasureData");

if (dir.exists()) {

return dir.toString();


} else {

dir.mkdirs();

Log.d("BAG", "保存路径不存在,");

return dir.toString();

}

}

}

5.activity_main.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    tools:context="myapplication.sensors_all.MainActivity">


    <TextView

        android:id="@+id/etGyro"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />

    <TextView

        android:id="@+id/etMagnetic"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />

    <TextView

        android:id="@+id/etLinearAcc"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />

    <Button

        android:id="@+id/bn1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Start"/>

    <Button


        android:id="@+id/bn2"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="stop" />

    <Button

        android:id="@+id/bn3"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="请输入文件名:" />

    <EditText

        android:id="@+id/filename"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />

</LinearLayout>

6.程序执行成功后,有可能手机上面有数据实时显示,但是手机Sdcard里面没有MesureData(保存我们的数据)这个文件夹,这是因为手机里面的app没有给予权限,所以对手机进行如下操作:设置-应用管理-已安装-找到Sensor_All这个App,并打开-点击权限-存储空间点上

2.jpg3.jpg

4.jpg7.软件界面(个别传感器数据可能需要再修正):

6.jpg

8.整个APP源代码文件如下所示:

Sensors_All.rar


致谢

        对桂林电子科技大学李思民硕士、浙江台州郭*网友、北京--db--网友的热心帮助表示衷心感谢!




https://wap.sciencenet.cn/blog-2777453-1108566.html

上一篇:0054: TDOA之Fang和Chan算法思路
下一篇:0064: 安卓Handler函数实现周期性收发消息功能(攻博记)
收藏 IP: 159.226.162.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (5 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-25 10:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部