2015-09-17 2 views
2

Можно ли обнаружить, когда телефон движется, как на изображении? Как это называется в Android?Обнаружение вращения телефона (движение)

Есть ли какие-либо события, которые обрабатывают такие вещи? Год назад я увидел приложение с компасом, и он работал в режиме реального времени.

Спасибо!

enter image description here

ответ

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

0

Вам нужно будет что-то вроде 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); 

И из-за этого вы получите Al необходимую информацию ...

Код:

  1. SensorManager

  2. SensorManager

1

Если вы знакомы с RxJava и реактивным программированием, вы можете использовать мою библиотеку с открытым исходным кодом, которая называется ReactiveSensors. Это обертка вокруг SensorManager из Android SDK и позволяет отслеживать изменения датчиков, излучаемые как наблюдаемый поток.

Вы можете использовать библиотеку следующим образом:

добавить следующую зависимость для вашего 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

Смежные вопросы