【问题标题】:Detecting phone rotation (movement)检测手机旋转(运动)
【发布时间】:2021-06-26 13:48:19
【问题描述】:

这是否可以检测到手机何时像图像上一样移动?这个在android中叫什么名字?

有没有处理这种事情的事件?一年前,我看到一个带有指南针的应用程序,它可以实时工作。

谢谢!

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    我希望这段代码会有所帮助

    package com.exercise.AndroidSensorEventListener;
    
    import java.util.List;
    
    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.widget.TextView;
    import android.widget.Toast;
    
    public class AndroidSensorEventListener extends Activity {
     private static SensorManager mySensorManager;
     private boolean sersorrunning;
     
       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
    
           mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
           List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
      
           if(mySensors.size() > 0){
            mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
            sersorrunning = true;
            Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();
           }
           else{
            Toast.makeText(this, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
            sersorrunning = false;
            finish();
           }
    
       }
      
       private SensorEventListener mySensorEventListener = new SensorEventListener() {
      
      @Override
      public void onSensorChanged(SensorEvent event) {
               System.out.println("Azimuth: " + String.valueOf(event.values[0]));
               System.out.println("Pitch: " + String.valueOf(event.values[1]));
               System.out.println("Roll: " + String.valueOf(event.values[2]));
      }
      
      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
     };
    
     @Override
     protected void onDestroy() {
      super.onDestroy();
      
      if(sersorrunning){
       mySensorManager.unregisterListener(mySensorEventListener);
       Toast.makeText(AndroidSensorEventListener.this, "unregisterListener", Toast.LENGTH_SHORT).show();
      }
     }
    }
    

    More examples here

    【讨论】:

      【解决方案2】:

      如果你熟悉 RxJava 和反应式编程,你可以使用我的开源库ReactiveSensors。它是 Android SDK 中 SensorManager 的封装,允许您监控作为可观察流发出的传感器变化。

      您可以通过以下方式使用该库:

      将以下依赖项添加到您的 build.gradle 文件中:

      dependencies {
        compile 'com.github.pwittchen:reactivesensors:0.1.2'
      }
      

      然后,您可以在代码中使用库:

      new ReactiveSensors(this).observeSensor(Sensor.TYPE_ORIENTATION)
          .subscribeOn(Schedulers.computation())
          .filter(ReactiveSensorEvent.filterSensorChanged())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(new Action1<ReactiveSensorEvent>() {
            @Override public void call(ReactiveSensorEvent reactiveSensorEvent) {
              SensorEvent event = reactiveSensorEvent.getSensorEvent();
      
              float x = event.values[0];
              float y = event.values[1];
              float z = event.values[2];
      
              String format = "orientation sensor readings:\n x = %f\n y = %f\n z = %f";
              String message = String.format(format, x, y, z);
              tvSensor.setText(message);
            }
          });
      

      在您的情况下,您可以使用 Sensor.TYPE_ORIENTATION,但它适用于 Android 设备上可用的各种传感器。

      完整的工作示例代码位于:https://github.com/pwittchen/ReactiveSensors/blob/master/app/src/main/java/com/github/pwittchen/reactivesensors/app/samples/OrientationActivity.java

      该库的详细说明、其源代码和示例工作应用程序可在以下位置获得:https://github.com/pwittchen/ReactiveSensors

      【讨论】:

        【解决方案3】:

        你需要像 SensorListener 这样的东西

        private final SensorListener sl = new SensorListener() {
            public void onSensorChanged(int sensor, float[] values) {
            }
        
            public void onAccuracyChanged(int sensor, int accuracy) {
            }
        };
        

        然后注册它:

        // Locate the SensorManager using Activity.getSystemService
        SensorManager sm;
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        
        // Register your SensorListener
        sm.registerListener(sl, SensorManager.SENSOR_ORIENTATION SensorManager.SENSOR_DELAY_NORMAL);
        

        你会得到你需要的所有信息......

        参考:

        1. SensorManager

        2. SensorManager

        【讨论】:

          【解决方案4】:
          猜你喜欢
          • 2011-03-01
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          相关资源
          最近更新 更多