采集手机加速度、陀螺仪、磁场

本文介绍了如何从智能手机中获取加速度计、陀螺仪和磁场传感器的数据,探讨了这些传感器在移动应用开发中的重要性,并提供了相关的API使用示例,帮助开发者实现更精确的设备运动跟踪和环境感知功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机界面:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:weightSum="1">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="详细列表"
            android:id="@+id/t1"
            android:layout_weight="0.19" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et1"
            android:layout_gravity="center_horizontal" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:weightSum="1">

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="开始"
                android:id="@+id/Start"
                android:layout_weight="0.33" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="结束"
                android:id="@+id/End"
                android:layout_weight="0.33" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="储存"
                android:id="@+id/Ensure"
                android:layout_weight="0.33" />
        </LinearLayout>

    </LinearLayout>
</RelativeLayout>

需要添加权限:

 <!--往sdcard中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--在sdcard中创建/删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
MainActivity.xml文件中的代码:

package com.example.hailang.acceleratedmagneticangle;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends Activity implements SensorEventListener{
    //加速度
    private EditText et1;
    private TextView t1;
    private Button btn_start,btn_end,btn_ensure;
    private SensorManager sm;
    private Sensor sensor;
    private float acc[]=new float[3];
    private File fi =null;
    private File fidir =null;
    private FileOutputStream fos =null;
    private Calendar mycalendar;
    private Timer updateTime;
    private TimerTask tt =null;

    //陀螺仪
    private float angle[] = new float[3];
    private Sensor magneticSensor;
    private SensorManager sensorManager;
    private Sensor gyroscopeSensor;
    private Sensor accelerometerSensor;

    //磁场
    private float mag[] = new float[3];


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

        //加速度
        sm=(SensorManager) this.getSystemService(SENSOR_SERVICE);
        sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
        btn_start=(Button) findViewById(R.id.Start);
        btn_end=(Button) findViewById(R.id.End);
        btn_ensure=(Button) findViewById(R.id.Ensure);
        et1=(EditText) findViewById(R.id.et1);
        t1=(TextView) findViewById(R.id.t1);
        btn_start.setOnClickListener(new StartClassListener());
        btn_start.setVisibility(View.INVISIBLE);
        btn_end.setOnClickListener(new EndClassListener());
        btn_end.setVisibility(View.INVISIBLE);
        btn_ensure.setOnClickListener(new EnsureClassListener());
        mycalendar=Calendar.getInstance();

        //陀螺仪 、磁场
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        magneticSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        accelerometerSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        //注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是SensorManager.SENSOR_DELAY_GAME(20000微秒)
        //SensorManager.SENSOR_DELAY_FASTEST(0微秒):最快。最低延迟,一般不是特别敏感的处理不推荐使用,该模式可能在成手机电力大量消耗,由于传递的为原始数据,诉法不处理好会影响游戏逻辑和UI的性能
        //SensorManager.SENSOR_DELAY_GAME(20000微秒):游戏。游戏延迟,一般绝大多数的实时性较高的游戏都是用该级别
        //SensorManager.SENSOR_DELAY_NORMAL(200000微秒):普通。标准延时,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象
        //SensorManager.SENSOR_DELAY_UI(60000微秒):用户界面。一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中不使用
        sensorManager.registerListener(this, gyroscopeSensor,
                SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(this, magneticSensor,
                SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(this, accelerometerSensor,
                SensorManager.SENSOR_DELAY_GAME);

    }
    //更新显示在屏幕上的信息,并且写到文件中
    public void updateGUI(){
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                SimpleDateFormat formatter    =   new    SimpleDateFormat    ("HH:mm:ss");
                Date curDate    =   new    Date(System.currentTimeMillis());//获取当前时间
                String    string    =    formatter.format(curDate);
                //更新显示在屏幕上的信息
                t1.setText(string + "\n"
                        + "加速度:" + "x=" + acc[0] + ",y=" + acc[1] + ",z=" + acc[2] + "\n"
                        + "陀螺仪:" + "x=" + angle[0] + ",y=" + angle[1] + ",y=" + angle[2] + "\n"
                        +  "磁场:" + "x=" + mag[0] + ",y=" + mag[1] + ",y=" + mag[2]);
                //写到文件中
                try {
                    fos.write((((string + "\n"
                            + "加速度:" + "x=" + acc[0] + ",y=" + acc[1] + ",z=" + acc[2] + "\n"
                            + "陀螺仪:" + "x=" + angle[0] + ",y=" + angle[1] + ",y=" + angle[2] + "\n"
                            +  "磁场:" + "x=" + mag[0] + ",y=" + mag[1] + ",y=" + mag[2])).getBytes()));
                    byte []newLine="\r\n".getBytes();
                    fos.write(newLine);
                    fos.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                System.out.println("hello");

            }
        });
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub

    }
    
    //采集数据
    @SuppressLint("NewApi")
    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub

        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){  //加速度
            for(int i=0;i<3;i++){
                acc[i]=event.values[i];
            }
        }
        else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){  //磁场
            for (int i=0; i<3; i++)
                mag[i] = event.values[i];
        }
        else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){  //陀螺仪
            for (int i=0; i<3; i++)
                angle[i] = event.values[i];
        }
    }

    //开始键触发事件
    class StartClassListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            updateTime = new Timer("Acc");

            tt =new TimerTask() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    updateGUI();
                }
            };
            updateTime.scheduleAtFixedRate(tt, 0, 10);

            try {
                fos = new FileOutputStream(fi.getAbsolutePath(),true);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            btn_start.setVisibility(View.INVISIBLE);
            btn_end.setVisibility(View.VISIBLE);
        }

    }
    //储存键触发事件
    class EnsureClassListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String etacc=et1.getText().toString();
            if(!etacc.equals("")){
                String filestr ="";
                filestr +="/sdcard/"+et1.getText().toString();
                if(!filestr.contains(".")){
                    filestr+=".txt";
                    fi=new File(filestr);
                    if(!fi.exists()){
                        System.out.println("creating it now!");
                        try {
                            fi.createNewFile();
                            Toast.makeText(MainActivity.this, "File isn't exits.Now,create it.",
                                    Toast.LENGTH_LONG).show();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            Toast.makeText(MainActivity.this, "新建文件失败", Toast.LENGTH_LONG).show();
                            e.printStackTrace();
                            System.out.println(e.toString());
                            finish();
                        }
                    }else{
                        Toast.makeText(MainActivity.this, "文件存在!", Toast.LENGTH_LONG).show();
                    }
                    btn_start.setVisibility(View.VISIBLE);
                }else{
                    et1.setText("文件名不正确,有非法符号或者错误信息");
                }
            }else{
                Toast.makeText(MainActivity.this, "输入文件名空,请重新输入!", Toast.LENGTH_LONG).show();
            }
        }

    }
    //结束键触发事件
    class EndClassListener implements View.OnClickListener {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            try {
                fos.write((mycalendar.getTime().toString()).getBytes());
                byte []newLine="\r\n".getBytes();
                fos.write(newLine);
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tt.cancel();
            updateTime.cancel();
            btn_end.setVisibility(View.INVISIBLE);
            btn_start.setVisibility(View.VISIBLE);
            btn_ensure.setOnClickListener(new EnsureClassListener());
        }
    }
}



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值