简体   繁体   English

如何在同一Java类中将两个传感器管理器用于加速度计和磁力计

[英]How to use Two Sensor Manager for Accelerometer and Magnetometer in the same Java class

I have Two programs (Accelerometer and Magnetometer) both using the Sensor Manager. 我有两个使用Sensor Manager的程序(加速度计和磁力计)。 I think the problem is when i combine these two programs into one to get their data, The onResume() is getting confused between which Sensor Manager to use in between the program. 我认为问题在于,当我将这两个程序合并为一个程序以获取其数据时,在程序之间使用哪个Sensor Manager之间,onResume()变得令人困惑。 Please do let me know if i can use two different requestListener for the two programs in The same Class. 请告诉我是否可以对同一类中的两个程序使用两个不同的requestListener。 The code is Below, Please do see The OnResume() method. 代码在下面,请参阅OnResume()方法。

@Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        mToolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(mToolbar);
        //Accelerometer--------------------------------------------------
        initializeViews();
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
            // success! we have an accelerometer
            accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            vibrateThreshold = accelerometer.getMaximumRange() / 2;
        } else {

            // fail we dont have an accelerometer!
        }

        //initialize vibration
        v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
        //----------------------------------------------------------------
        //Magnetometer------------------------------------------------------
        uT = (TextView) findViewById(R.id.textView2);
        max = (TextView) findViewById(R.id.textView3);
        min = (TextView) findViewById(R.id.textView4);
        // Get an instance of the sensor service
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mMagnetometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);


        PackageManager PM = this.getPackageManager();
        boolean gyro = PM.hasSystemFeature(PackageManager.FEATURE_SENSOR_GYROSCOPE);
        boolean light = PM.hasSystemFeature(PackageManager.FEATURE_SENSOR_LIGHT);


        if (gyro) {

            if (light) {
                Toast.makeText(getApplicationContext(), "Both light and gyroscope sensors are present", Toast.LENGTH_LONG).show();
            } else
                Toast.makeText(getApplicationContext(), "Only gyroscope sensor is present", Toast.LENGTH_LONG).show();

        }
        //-----------------------------------------------------------------------------------

    }
    //Accelerometer-----------------------------------------------------------

    private void initializeViews() {
        currentX = (TextView) findViewById(R.id.currentX);
        currentY = (TextView) findViewById(R.id.currentY);
        currentZ = (TextView) findViewById(R.id.currentZ);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_first, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        if (id == R.id.home_button){
            startActivity(new Intent(this, MainActivity.class));
        }

        return super.onOptionsItemSelected(item);
    }

    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mMagnetometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
    }


    //onPause() unregister the accelerometer for stop listening the events

    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener( this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // clean current values


        // display the current x,y,z accelerometer values

        // display the max x,y,z accelerometer values
        displayMaxValues();


        // get the change of the x,y,z values of the accelerometer

        deltaXX = Math.abs(lastX - event.values[0]);
        deltaX= deltaXX/2;
        deltaYY = Math.abs(lastY - event.values[1]);
        deltaY = deltaYY/2;
        deltaZZ = Math.abs(lastZ - event.values[2]);
        deltaZ= deltaZZ/2;

        // if the change is below 2, it is just plain noise

        if (deltaX < 2)
            deltaX = 0;
        if (deltaY < 2)
            deltaY = 0;
        if ((deltaX > vibrateThreshold) || (deltaY > vibrateThreshold) || (deltaZ > vibrateThreshold)) {
            v.vibrate(1);
        }
        //Magnetometer--------------------------------------------------
            float angularXSpeed = event.values[0];
            DecimalFormat decimalFormatuT = new DecimalFormat("00.00");
            Double CurrentuT = Double.parseDouble(decimalFormatuT.format(angularXSpeed));

            if (angularXSpeed > max1) {
                max1 = angularXSpeed;
                DecimalFormat decimalFormatMaxMag = new DecimalFormat("00.00");
                Double MaxMag = Double.parseDouble(decimalFormatMaxMag.format(max1));
                max.setText("Max " + "" + MaxMag);
            } else if (angularXSpeed < min1) {
                min1 = angularXSpeed;
                DecimalFormat decimalFormatMinMag = new DecimalFormat("00.00");
                Double MinMag = Double.parseDouble(decimalFormatMinMag.format(min1));
                min.setText("Min " + "" + MinMag);
            }

        //------------------------------------------------------------

    }

    private void displayMaxValues() {



        if (deltaX > deltaXMax) {
            deltaXMax = deltaX;
            maxX = (TextView) findViewById(R.id.maxX);
            DecimalFormat decimalFormat = new DecimalFormat("00.00");
            Double MaxXX = Double.parseDouble(decimalFormat.format(deltaXMax));
            maxX.setText(Double.toString(MaxXX));

        }

        if (deltaY > deltaYMax) {
            deltaYMax = deltaY;
            maxY = (TextView) findViewById(R.id.maxY);
            DecimalFormat decimalFormat = new DecimalFormat("00.00");
            Double MaxYY = Double.parseDouble(decimalFormat.format(deltaYMax));
            maxY.setText(Double.toString(MaxYY));

        }

        if (deltaZ > deltaZMax) {
            deltaZMax = deltaZ;
            maxZ = (TextView) findViewById(R.id.maxZ);
            DecimalFormat decimalFormat = new DecimalFormat("00.00");
            Double MaxZZ = Double.parseDouble(decimalFormat.format(deltaZMax));
            maxZ.setText(Double.toString(MaxZZ));


        }

    }




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

    }
    //Accelerometer--------------------------------------------------------------
}

you can access all sensors on device by using SensorManager Instance. 您可以使用SensorManager实例访问设备上的所有传感器。 just modify your code as following, and call register into onResume only as : 只需按以下方式修改您的代码,然后仅按以下方式将注册调用到onResume中:

protected void onCreate(Bundle savedInstanceState) {
  ....
  mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
  if ((accelerometer  = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null ) {...}
  if ((magnetometer   = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null ) {...}
  ....
}
// register the sensors only one time within onResume not in onCreate
@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
  }

also you have to check the sensor type in method onSensorChanged as following: 另外,您还必须在方法onSensorChanged中检查传感器类型,如下所示:

onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
      ....
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
      ....
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 不同的传感器(磁力计,加速度计)如何工作以制作指南针-Android(Java) - How does different sensor(magnetometer, accelerometer) work to make compass - Android (Java) Android加速度计和磁力计同时读取 - Android Accelerometer and Magnetometer readings simultaneously 加速度传感器在横向模式下的设置与纵向设置相同 - Accelerometer sensor keep same settings on landscape mode as portrait 我可以在 android 中同时在两个应用程序中使用陀螺仪传感器吗? - Can I use gyroscope sensor in two application at same time in android? 如何在两个Java文件中使用相同的字符串 - how to use same string in two java files Java:对两个不同版本的依赖类使用相同的代码 - Java: Use the same code with two different versions of a dependent class 如何将来自加速度传感器的数据写入文件并在matlab上写入? - How to write data from the accelerometer sensor on a file and write on matlab? 如何通过加速计传感器移动布局? - How can i move my layout via accelerometer sensor? 如何使用Android的加速度计 - How to use Android's Accelerometer 如何设置 Java Selenium 的 xPath 有两个相同的 ZA2F2ED4F8DCEBC2CBB4DZC21A2 表 - How to set xPath of Java Selenium when there are two table of same class
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM