package wits.sensor;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.RotateAnimation;import android.widget.ImageView;import android.widget.TextView;import java.text.DecimalFormat;import java.util.List;import androidx.core.app.ActivityCompat;import wits.utils.SPUtils;public class SensorActivity extends Activity {    private TextView altitudeTv, latitudeTv, longitudeTv, altTv, gpsTv;    private ImageView imgX, imgY;    private float mBaseX, mBaseY, mBaseZ, mXdegree, mYdegree, mZdegree;    private final DecimalFormat sigDigits = new DecimalFormat("0.######"); // 小数点保留5位    private final DecimalFormat formatAlt = new DecimalFormat("0.##");     // 小数点保留2位    private final String CHEKC_X = "checkX";    private final String CHEKC_Y = "checkY";    private final String CHEKC_Z = "checkZ";    private final String IS_FIRST_BASE = "isFirst";    private boolean isFirst;    private int count;    private SensorManager mSensorManager;    private LocationManager mLocationManager;    private Location mLocation;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.gyroscope_layout);        initIds();        initSensor();        initGps();    }    private void initIds() {        imgX        = findViewById(R.id.imgGyroViewX);        imgY        = findViewById(R.id.imgGyroViewY);        altitudeTv  = findViewById(R.id.altitude_tv);        latitudeTv  = findViewById(R.id.latitude_tv);        longitudeTv = findViewById(R.id.longitude_tv);        altTv       = findViewById(R.id.tvAltitudeValue1);        gpsTv       = findViewById(R.id.gps_tv);        isFirst = SPUtils.getSPUtils(SensorActivity.this).getValue(IS_FIRST_BASE, true); // 获取基本的数字,校准时以这个数字作为基准 默认是0        imgX.setOnLongClickListener(longListener);        imgY.setOnLongClickListener(longListener);    }    private void initSensor() {        Log.d("--initSensor()-->");        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);        ////  TYPE_GYROSCOPE     陀螺仪传感器////  TYPE_ACCELEROMETER 加速度传感器        mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);    }    private void initGps() {        Log.d("--initGps()-->");        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(SensorActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, 10010);            Log.d("--checkSelfPermission-->");        }        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, locationListener);        mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);    }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   private SensorEventListener mSensorEventListener = new SensorEventListener() {       @Override       public void onSensorChanged(SensorEvent event) { // Sensor数据从这里读出           float xFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_X]));            float yFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_Y]));            float zFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_Z]));            calcDegree(xFloat, yFloat, zFloat);            count++;            if (count == 10) {                calcDegree(xFloat, yFloat, zFloat);                mHandler.sendEmptyMessage(0);                Log.d("xFloat:" + xFloat + ", yFloat:" + yFloat);                count = 0;            }       }       @Override       public void onAccuracyChanged(Sensor sensor, int accuracy) {  }   };/////////////Gps///////Gps//////////Gps///////////////////Gps/////////////////Gps////////////////////////////////////////////////////    private LocationListener locationListener = new LocationListener() {        @Override        public void onLocationChanged(Location location) {            double log = location.getLongitude();            double lat =  location.getLatitude();            double alt = location.getAltitude();            gpsTv.setText("经度 :"+sigDigits.format(log) +"\n"  + "纬度 :"+sigDigits.format(lat)+"\n"  +"海拔  :"+sigDigits.format(alt));            Log.d("--info-->" + "时间 :"+location.getTime() + " , 经度:"+location.getLongitude() + " , 纬度:"+location.getLatitude() + " , 海拔:"+location.getAltitude());            updateGpsView(location);        }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {            gpsTv.setText(" onStatusChanged ");        }        @Override        public void onProviderEnabled(String provider) {            gpsTv.setText(" onProviderEnabled ");        }        @Override        public void onProviderDisabled(String provider) {            gpsTv.setText(" onProviderDisabled ");        }    };    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 10010) {//            gpsTv.setText(" permissions ");            initGps();        }    }///////////GPS END/////GPS END//////////GPS END/////////////////GPS END///////////GPS END///////////GPS END////////////GPS END////////////////////////////////////////////////////    private void calcDegree(float x, float y, float z) {        float base = (float) Math.sqrt((double) ((x * x) + (y * y) + (z * z)));        mXdegree = ((float) (Math.acos((double) (x / base)) / Math.PI)) * 180.0f;        mYdegree = ((float) (Math.acos((double) (y / base)) / Math.PI)) * 180.0f;        mZdegree = ((float) (Math.acos((double) (z / base)) / Math.PI)) * 180.0f;        if(isFirst) { // 首次使用校准一下角度            reset();            isFirst = false;            SPUtils.getSPUtils(SensorActivity.this).setValue(IS_FIRST_BASE, false);        }    }    private DecelerateInterpolator decelerateInterpolator = new DecelerateInterpolator();    private Animation mAnimationX, mAnimationY;    private float mPrevX, mPrevY;    private float mXAvarageValue, mYAvarageValue;    private Handler mHandler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case 0:                    removeMessages(0);                    float ChangeX = mXdegree - Math.abs(mBaseX);                    float ChangeY = mYdegree - Math.abs(mBaseY);                    synchronized (this) {                        mYAvarageValue = (mYAvarageValue + ChangeY);                        mYAvarageValue = mYAvarageValue / 2.0f;                        if (Math.abs(mYAvarageValue - mPrevY) > 1.0f) {                            mAnimationY = new RotateAnimation(mPrevY, mYAvarageValue, 1, 0.5f, 1, 0.5f);                            mAnimationY.setDuration(1000);                            mAnimationY.setInterpolator(decelerateInterpolator);                            mAnimationY.setFillAfter(true);                            imgY.startAnimation(mAnimationY);                            mPrevY = mYAvarageValue;                        }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                        mXAvarageValue  = mXAvarageValue + ChangeX;                        mXAvarageValue  = mXAvarageValue / 2.0f;                        if (Math.abs(mXAvarageValue - mPrevX) > 1.0f) {                            mAnimationX = new RotateAnimation(mPrevX, mXAvarageValue, 1, 0.5f, 1, 0.5f);                            mAnimationX.setDuration(1000);                            mAnimationX.setInterpolator(decelerateInterpolator);                            mAnimationX.setFillAfter(true);                            imgX.startAnimation(mAnimationX);                            mPrevX = mXAvarageValue;                        }                    }                    break;            }        }    };    /**private void initData() {     mBaseX = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_X, 0.0f);     mBaseY = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_Y, 0.0f);     mBaseZ = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_Z, 0.0f);     mXAvarageValue = 0.0f;     mYAvarageValue = 0.0f;     mPrevX = 0.0f;     mPrevY = 0.0f;     mHandler.sendEmptyMessage(0);     }*/    private void updateGpsView(Location location) {        String altValue = sigDigits.format(location.getAltitude());        String latValue = sigDigits.format(location.getLatitude());        String logValue = sigDigits.format(location.getLongitude());        altitudeTv.setText(altValue+"m");        latitudeTv.setText(latValue);        longitudeTv.setText(logValue);        altTv.setText(altValue+"m");    }    private void refreshBaseData() {        mBaseX = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_X, mXdegree);        mBaseY = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_Y, mYdegree);        mBaseZ = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_Z, mZdegree);    }    private void reset() {        mBaseX = mXdegree;        mBaseY = mYdegree;        mBaseZ = mZdegree;        SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_X, mBaseX);        SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_Y, mBaseY);        SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_Z, mBaseZ);    }    private View.OnLongClickListener longListener = new View.OnLongClickListener() {        @Override        public boolean onLongClick(View v) {            switch (v.getId()) {                case R.id.imgGyroViewX:                case R.id.imgGyroViewY:                    reset();                    break;            }            return false;        }    };    @Override    protected void onResume() {        super.onResume();        refreshBaseData();    }    @Override    protected void onDestroy() {        super.onDestroy();        mSensorManager.unregisterListener(mSensorEventListener);        mLocationManager.removeUpdates(locationListener);        mSensorManager   = null;        mLocationManager = null;    }}

 

更多相关文章

  1. Android(安卓)EditText保留小数点后两位
  2. android gps开发
  3. Android(安卓)GPS 开发
  4. Android中EditText的inputType属性
  5. Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说
  6. Oracle 11g中的IO Calibrate(IO校准)--Automatic Degree of Parall
  7. Android——EditText金额输入控制位数(小数点前几位,小数点后几位)
  8. Android(安卓)OpenGL相关
  9. Android(安卓)EditText监听小数点让用户只能输入小数点后两位

随机推荐

  1. How to Install Ubuntu on Android!
  2. android TabHost 对象报错
  3. android判断一个Service是否存在
  4. Android(安卓)MediaMuxer混合音频和视频
  5. android Thread和Runnable的区别
  6. android 创建快捷方式
  7. android updater-scrip
  8. [Android] 监听wifi状态
  9. PointerLocationView 源码分析
  10. android notification点击与移除监听