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. c语言float类型小数点后有几位有效数字?
  3. 尝试将纬度和经度发布到数据库时,Android JSON解析错误
  4. 高德地图api接口poi检索示例----并在信息框显示经纬度
  5. SQL Server 中 存储“经纬度”应设置的数据类型
  6. Sql经纬度计算与C#经纬度计算
  7. 根据两点经纬度计算距离和角度——java实现

随机推荐

  1. php开启和关闭错误提示的方法介绍
  2. PHP生成器-动态生成内容的数组
  3. PHP7中创建COOKIE和销毁COOKIE的方法
  4. PHP中设置session过期的方法
  5. php实现将文件上传到临时目录
  6. PHP7中创建session和销毁session的方法
  7. PHP底层分析之关于强制分裂
  8. PHP 枚举类型的管理与设计
  9. PHP中mysqli_get_server_version()的用法
  10. Centos下PHP5升级为PHP7的方法