Android
SensorManager
खोज…
सेंसर की घटनाओं को पुनः प्राप्त करना
जहाज पर सेंसर से पुनर्प्राप्त सेंसर जानकारी:
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor accelerometer;
private Sensor gyroscope;
float[] accelerometerData = new float[3];
float[] gyroscopeData = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
gyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
}
@Override
public void onResume() {
//Register listeners for your sensors of interest
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_FASTEST);
super.onResume();
}
@Override
protected void onPause() {
//Unregister any previously registered listeners
mSensorManager.unregisterListener(this);
super.onPause();
}
@Override
public void onSensorChanged(SensorEvent event) {
//Check the type of sensor data being polled and store into corresponding float array
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerData = event.values;
} else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
gyroscopeData = event.values;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
विश्व समन्वय प्रणाली के लिए सेंसर परिवर्तन
एंड्रॉइड द्वारा लौटाए गए सेंसर वैल्यू फोन के कोऑर्डिनेट सिस्टम से संबंधित हैं (जैसे फोन के टॉप की ओर + Y पॉइंट)। हम सेंसर प्रबंधकों मैट्रिक्स का उपयोग करके इन सेंसर मूल्यों को एक विश्व समन्वय प्रणाली (जैसे चुंबकीय उत्तर की ओर, जमीन पर स्पर्शरेखा) में बदल सकते हैं
सबसे पहले, आपको मैट्रिसेस / सरणियों को घोषित करने और आरंभ करने की आवश्यकता होगी जहां डेटा संग्रहीत किया जाएगा (उदाहरण के लिए, आप onCreate
विधि में ऐसा कर सकते हैं):
float[] accelerometerData = new float[3];
float[] accelerometerWorldData = new float[3];
float[] gravityData = new float[3];
float[] magneticData = new float[3];
float[] rotationMatrix = new float[9];
अगला, हमें सेंसर मूल्यों में परिवर्तन का पता लगाने की आवश्यकता है, उन्हें संबंधित सरणियों में संग्रहीत करें (यदि हम उन्हें बाद में / कहीं और उपयोग करना चाहते हैं), तो रोटेशन मैट्रिक्स की गणना करें और परिणामस्वरूप विश्व निर्देशांक में परिवर्तन करें:
public void onSensorChanged(SensorEvent event) {
sensor = event.sensor;
int i = sensor.getType();
if (i == Sensor.TYPE_ACCELEROMETER) {
accelerometerData = event.values;
} else if (i == Sensor.TYPE_GRAVITY) {
gravityData = event.values;
} else if (i == Sensor.TYPE_MAGNETIC) {
magneticData = event.values;
}
//Calculate rotation matrix from gravity and magnetic sensor data
SensorManager.getRotationMatrix(rotationMatrix, null, gravityData, magneticData);
//World coordinate system transformation for acceleration
accelerometerWorldData[0] = rotationMatrix[0] * accelerometerData[0] + rotationMatrix[1] * accelerometerData[1] + rotationMatrix[2] * accelerometerData[2];
accelerometerWorldData[1] = rotationMatrix[3] * accelerometerData[0] + rotationMatrix[4] * accelerometerData[1] + rotationMatrix[5] * accelerometerData[2];
accelerometerWorldData[2] = rotationMatrix[6] * accelerometerData[0] + rotationMatrix[7] * accelerometerData[1] + rotationMatrix[8] * accelerometerData[2];
}
एक्सेलेरोमीटर का उपयोग करके तय करें कि आपका डिवाइस स्थिर है या नहीं
निम्न कोड जोड़ें onCreate()
/ onResume()
विधि:
SensorManager sensorManager;
Sensor mAccelerometer;
final float movementThreshold = 0.5f; // You may have to change this value.
boolean isMoving = false;
float[] prevValues = {1.0f, 1.0f, 1.0f};
float[] currValues = new float[3];
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
आपको परीक्षण और त्रुटि के आधार पर movementThreshold
को समायोजित करके संवेदनशीलता को समायोजित करना पड़ सकता है। उसके बाद, onSensorChanged()
विधि को इस प्रकार से ओवरराइड करें:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor == mAccelerometer) {
System.arraycopy(event.values, 0, currValues, 0, event.values.length);
if ((Math.abs(currValues[0] - prevValues[0]) > movementThreshold) ||
(Math.abs(currValues[1] - prevValues[1]) > movementThreshold) ||
(Math.abs(currValues[2] - prevValues[2]) > movementThreshold)) {
isMoving = true;
} else {
isMoving = false;
}
System.arraycopy(currValues, 0, prevValues, 0, currValues.length);
}
}
यदि आप अपने ऐप को उन उपकरणों पर इंस्टॉल होने से रोकना चाहते हैं जिनमें एक्सेलेरोमीटर नहीं है, तो आपको अपने मैनिफ़ेस्ट में निम्न पंक्ति जोड़नी होगी:
<uses-feature android:name="android.hardware.sensor.accelerometer" />