|||
开发APP主要注意点(AS版本号2.3.3):
使用jxl读取操作excel文件:
权限代码在AndroidManifest.xml文件下的package代码下添加读取权限:
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,并打开-点击权限-存储空间点上
7.软件界面(个别传感器数据可能需要再修正):
8.整个APP源代码文件如下所示:
致谢
对桂林电子科技大学李思民硕士、浙江台州郭*网友、北京--db--网友的热心帮助表示衷心感谢!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-20 01:38
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社