2017-04-24 9 views
1

Ich teste den Beschleunigungssensor. Alles funktioniert perfekt mit dem virtuellen Gerät, das von Android Studio emuliert wird. Wenn ich meinen Code auf meinem echten Smartphone ausprobiere, passiert nichts in den Protokollen. Blick auf den Code unten:Android-Beschleunigungssensor funktioniert nur im virtuellen Emulator

import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity implements SensorEventListener { 

private SensorManager senSensorManager; 
private Sensor senAccelerometer; 
private long lastUpdate = 0; 
private float last_x, last_y, last_z; 
private long diffTime; 
private static final int SHAKE_THRESHOLD = 600; 
ArrayList numbersGenerated = new ArrayList(); 
private ArrayList<Row> rows; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 

    Sensor mySensor = sensorEvent.sensor; 

    if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     ArrayList<Row> rows = new ArrayList<>(); 
     Row row; 


     float x = sensorEvent.values[0]; 
     float y = sensorEvent.values[1]; 
     float z = sensorEvent.values[2]; 

     long curTime = System.currentTimeMillis(); 

     if ((curTime - lastUpdate) > 100) { 
      long diffTime = (curTime - lastUpdate); 
      lastUpdate = curTime; 
     } 
     float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000; 

     if (speed > SHAKE_THRESHOLD) { 
      System.out.println("X\t Y\tZ"); 
      last_x = x; 
      last_y = y; 
      last_z = z; 
      row = new Row(x,y,z); 
      rows.add(row); 
     } 

     System.out.println("X\t Y\tZ"); 
     System.out.println("----------------------"); 
     for (Row printRow : rows) 
     { 
      System.out.println(
        printRow.getX() + "\t " + 
          printRow.getY() + "\t" + 
          printRow.getZ()); 

    } 


    } 
else{ 
     System.out.println("no accelerometer"); 
    } 
} 

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

} 

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

protected void onResume() { 
    super.onResume(); 
    senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 

class Row 
{ 

    // REMEMBER: each attribute is a column 
    // 
    private final float x; 
    private final float y; 
    private final float z; 

    public Row(float x, float y, float z) 
    { 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 

    public float getX() 
    { 
     return x; 
    } 

    public float getY() 
    { 
     return y; 
    } 

    public float getZ() 
    { 
     return z; 
    } 

} 

Haben Sie eine Vorstellung davon, warum es nicht funktioniert? Ich habe Android 4 auf meinem Smartphone und ich habe mit der richtigen Version eingerichtet. Danke!

Antwort

0

Vielleicht funktioniert der Beschleunigungssensor Ihres Telefons nicht? System.out.println ist keine gute Möglichkeit zum Protokollieren. Verwenden Sie stattdessen den Befehl LOG. Versuchen Sie stattdessen, auf dem App-Bildschirm zu loggen, ändert sich das?

+0

Danke, du hast Recht, ich habe die Variationen auf dem Bildschirm gedruckt und funktioniert gut. – lolotte

+0

Gut zu helfen, ich habe das selbe Problem selbst angetroffen – DKIT

Verwandte Themen