2017-05-13 4 views
2

Ich möchte Beschleunigungssensor Daten, die in der Erdachse durch einen Service ist. Ich lese über einen Weg, es auch auf einem der Beiträge auf stackoverflow zu tun. Aber ich habe ein Problem.Schwerkraftsensor Zuhörer funktioniert nicht

@Override 
public void onSensorChanged(SensorEvent event) { 
    Toast.makeText(this, "Hollyy shiiitt",Toast.LENGTH_SHORT); 
    String acceldata = ""; 

    float[] gravityValues = null; 
    float[] magneticValues = null; 

    if (event.sensor.getType() == Sensor.TYPE_GRAVITY) { 
     gravityValues = event.values.clone(); 
     Toast.makeText(this, "The gra data is " + String.valueOf(gravityValues), Toast.LENGTH_SHORT); 
    } 

    if ((gravityValues != null) && (magneticValues != null) 
      && (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)) { 

     // float for use in conversion device relative acceleration to earth axis acceleration 
     float[] deviceRelativeAcceleration = new float[4]; 
     deviceRelativeAcceleration[0] = event.values[0]; 
     deviceRelativeAcceleration[1] = event.values[1]; 
     deviceRelativeAcceleration[2] = event.values[2]; 
     deviceRelativeAcceleration[3] = 0; 

     // Change the device relative acceleration values to earth relative values 
     // X axis -> East 
     // Y axis -> North Pole 
     // Z axis -> Sky 

     float[] R = new float[16], I = new float[16], earthAcc = new float[16]; 

     SensorManager.getRotationMatrix(R, I, gravityValues, magneticValues); 

     float[] inv = new float[16]; 

     android.opengl.Matrix.invertM(inv, 0, R, 0); 
     android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, deviceRelativeAcceleration, 0); 

     acceldata = String.valueOf(lat) + "," + String.valueOf(lon) + "," + String.valueOf(speed)+","+ String.valueOf(earthAcc[0]) + "," + String.valueOf(earthAcc[1]) + "," + String.valueOf(earthAcc[2])+ "," + String.valueOf(event.values[0])+ "," + String.valueOf(event.values[1])+ "," + String.valueOf(event.values[2]); 

    } 

    //SDK version check 
    if(Build.VERSION.SDK_INT > 18) { 
     File file; 
     FileWriter filew; // Internal Storage writing 
     try { 
      file = new File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS) + "/" + filename); //Android 4.4 and above 
      filew = new FileWriter(file, true); //true for append 
      filew.write(acceldata + String.valueOf(gravityValues) + String.valueOf(magneticValues) +  "\n"); 
      filew.close(); 


     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 
    else{ 
     String data = acceldata + "\n" ; 
     try { 
      FileOutputStream fOut = openFileOutput("/" + filename,Context.MODE_APPEND); 
      fOut.write(data.getBytes()); 
      fOut.close(); 
      Toast.makeText(getBaseContext(),"file saved",Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Toast.makeText(getBaseContext(),"file not saved API < 19",Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

Die if-Anweisung für Schwerkraftsensor vor Ort einen beliebigen Wert nicht zurück geändert, so dass die nächste Anweisung funktioniert auch nicht, wie gravityValues ​​hat einen Nullwert.

Die Sensoren registriert sind

mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mMagnetsensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
mGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 

Sie werden dann als

int SamplingFrequency = 2 * 100000; // delay in microsecond. in this case 0.2 second 
sensorManager.registerListener(this, mAccelerometer,SamplingFrequency); 
sensorManager.registerListener(this, mMagnetsensor, SamplingFrequency); 
sensorManager.registerListener(this,mGravity,SamplingFrequency); 

ich ein Neuling in App-Entwicklung bin registriert, so würde jede mögliche Hilfe geschätzt.

Antwort

1

Ihr Gerät hat wahrscheinlich keinen Schwerkraftsensor. Überprüfen Sie, ob es verfügbar ist

if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) { 
     Toast.makeText(ActivitySensor1Availability.this, "Gravity AVAILABLE", Toast.LENGTH_SHORT).show(); 
    } else { 
     // Failure! No Gravity Sensor. 
     Toast.makeText(ActivitySensor1Availability.this, "Failure! No Gravity Sensor", Toast.LENGTH_SHORT).show(); 
    } 
+0

Gravity available Toast erscheint auf dem Bildschirm, wenn ich diesen Code in meiner Anwendung versuchen. Irgendwelche anderen Vorschläge? –

+0

Ja, ohne komplexe etwas zu tun, wenn Sie Werte von Schwerkraftsensor 'if (event.sensor.getType() == Sensor.TYPE_GRAVITY) { \t \t \t System.out.println ("X:" bekommen + event.values ​​[0]); \t \t \t System.out.println ("Y:" + Ereignis.Werte [1]); \t \t \t System.out.println ("Z:" + Ereignis.Werte [2]); \t \t \t} ' – Thracian

+0

Nicht sicher, aber wenn ich Linear_Acceleration-Sensor hinzugefügt, dann begann der Schwerkraftsensor Werte zu werfen. –