PhoneActivity

package com.mobvoi.ticwear.mobvoiapidemo;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
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.RandomAccessFile;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class PhoneActivity extends AppCompatActivity implements SensorEventListener, View.OnClickListener {
    private SensorManager sm;
    private Button mWriteButton,mStopButton;
    private TextView mTextView;
    private EditText etTxt1,etTxt2,etTxt3,etTxt4,etTxt5,etTxt6;
    private String messages,message1,message2,message3,message4,message5,message6;
    private Boolean doWrite = false;
    private int count=0;
    private String strcount;
    private PowerManager.WakeLock wakeLock = null;//电源服务,保持屏幕常亮
    //WakeLock是android系统中一种锁的机制,只要有进程持有这个锁,系统就无法进入休眠状态。
    float[] magneticValues=new float[3];
    float[] gravityValues=new float[3];
    float[] accelerometerValues = new float[3];
    private float [] Rx=new float[9];
    private String Rstring;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phone);//设置该activity显示
        mTextView = (TextView)findViewById(R.id.textView);
        etTxt1=(EditText) findViewById(R.id.txt1);
        etTxt2=(EditText) findViewById(R.id.txt2);
        etTxt3=(EditText) findViewById(R.id.txt3);
        etTxt4=(EditText) findViewById(R.id.txt4);
        etTxt5=(EditText) findViewById(R.id.txt5);
        etTxt6=(EditText) findViewById(R.id.txt6);
        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);//创建一个SensorManager来获取系统的传感器服务

        mWriteButton = (Button) findViewById(R.id.Button_Write);
        mWriteButton.setOnClickListener(this);
        mStopButton = (Button) findViewById(R.id.Button_Stop);
        mStopButton.setOnClickListener(this);
        Timer timer = new Timer(true);
        TimerTask task = new TimerTask() {
            public void run() {
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SS");
                String str = sdf.format(new Date());
                if (doWrite) {
                    Rstring=Rx[0]+" "+Rx[1]+" "+Rx[2]+" "+Rx[3]+" "+Rx[4]+" "+Rx[5]+" "+Rx[6]+" "+Rx[7]+" "+Rx[8];
                    messages=str+" "+message1+" "+message2+" "+message3+" "+message4+" "+message5+" "+message6+" "+Rstring+"\n";
                    writeFileSdcard(messages);
                }
            }
        };
        timer.schedule(task, 0, 20);//第二个参数的意思是,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行run() 方法。
                                                //第三个参数的意思就是,第一次调用之后,从第二次开始每隔多长的时间调用一次run()方法。单位:毫秒
    }

    @Override
    protected void onResume() {
        acquireWakeLock(this);//将获得到的锁使用acquire()方法来保持唤醒
        super.onResume();
        //  注册传感器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), 20000);
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 20000);
        sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_GRAVITY), 20000);
        sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 20000);
        sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), 20000);
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 20000);
    }
    //将获得到的锁使用acquire()方法来保持唤醒
    public void acquireWakeLock(Context context) {
        if (wakeLock == null) {
            PowerManager powerManager = (PowerManager)(context.getSystemService(Context.POWER_SERVICE));//获取PowerManager实例
            //SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
            wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");//生成WakeLock实例

            wakeLock.acquire();
        }
    }
    //使用release()方法来释放掉该锁
    public void releaseWakeLock() {
        if(wakeLock != null && wakeLock.isHeld()){
            wakeLock.release();
            wakeLock = null;
        }
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        DecimalFormat df = new DecimalFormat("###0.000000");
        int sensorType = event.sensor.getType();
        switch (sensorType) {
            case Sensor.TYPE_ACCELEROMETER:
                float X1=event.values[0];
                float Y1=event.values[1];
                float Z1=event.values[2];
                message1 = df.format(X1) + " " + df.format(Y1) + " " + df.format(Z1);
                //****************修改处********************************************
                accelerometerValues = event.values.clone();
                SensorManager.getRotationMatrix(Rx, null, accelerometerValues, magneticValues);
                etTxt1.setText(message1);
                break;
            case Sensor.TYPE_LINEAR_ACCELERATION:
                float X2=event.values[0];
                float Y2=event.values[1];
                float Z2=event.values[2];
                message2 = df.format(X2) + " " + df.format(Y2) + " " + df.format(Z2);
                etTxt2.setText(message2);
                break;
            case Sensor.TYPE_GRAVITY:
                float X3=event.values[0];
                float Y3=event.values[1];
                float Z3=event.values[2];
                message3=df.format(X3) + " " + df.format(Y3) + " " + df.format(Z3);
                //****************修改处********************************************
                //gravityValues=event.values.clone();
                //SensorManager.getRotationMatrix(Rx, null, gravityValues, magneticValues);
                //****************修改处********************************************
                etTxt3.setText(message3);
                break;
            case Sensor.TYPE_GYROSCOPE:
                float X4=event.values[0];
                float Y4=event.values[1];
                float Z4=event.values[2];
                message4=df.format(X4) + " " + df.format(Y4) + " " + df.format(Z4);
                etTxt4.setText(message4);
                break;
            case Sensor.TYPE_ORIENTATION:
                float X5=event.values[0];
                float Y5=event.values[1];
                float Z5=event.values[2];
                message5=df.format(X5) + " " + df.format(Y5) + " " + df.format(Z5);
                etTxt5.setText(message5);
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                float X6=event.values[0];
                float Y6=event.values[1];
                float Z6=event.values[2];
                message6=df.format(X6) + " " + df.format(Y6) + " " + df.format(Z6);
                magneticValues=event.values.clone();
                SensorManager.getRotationMatrix(Rx, null, accelerometerValues, magneticValues);
                etTxt6.setText(message6);
                break;
        }
    }

    /**
     * 信息写入手机SD卡
     * @param message 信息
     */
    private void writeFileSdcard(String message) {
        try {
            // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                // 获取SD卡的目录
                File sdCardDir = Environment.getExternalStorageDirectory();
                File targitFile = new File(sdCardDir.getCanonicalPath() + "/PhoneData"+strcount+".txt");
                // 以指定文件创建 RandomAccessFile对象
                RandomAccessFile raf = new RandomAccessFile(targitFile, "rw");
                // 将文件记录指针移动到最后
                raf.seek(targitFile.length());
                // 输出文件内容
                raf.write(message.getBytes());
                // 关闭RandomAccessFile
                raf.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    protected void onPause() {
        releaseWakeLock();
        super.onPause();
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.Button_Write) {
            doWrite = true;
            count++;
            mTextView.setText("Writing...PhoneData"+count);
            SimpleDateFormat sdft = new SimpleDateFormat("yyyyMMdd-HHmmss");
            strcount = sdft.format(new Date());
        }
        if (v.getId() == R.id.Button_Stop) {
            doWrite = false;
            mTextView.setText("PhoneData"+count+" 状态:stop");
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容