App Absturz bei aufrufen von getSystemService(Sensor_Service)

  • Hallo erstmal!


    Ich da ein kleines Anfängerproblem. Und zwar bricht meine App immer an einer bestimmten Stelle ab. Über den Debugger und im Catlog habe ich sie ausfindig gemacht.


    Es handelt sich um eine Methode zum Sensor Initalisieren. die Methode ist in der Klasse "Sensoren".
    Ich verstehe nich warum das nicht geht. den selben Code habe ich mal direkt in eine Methode unter Main geschrieben da gings!!! Es gibt keine offensichtlichen Problems oder Hinweise.


    Hier der Code:


    public class Sensoren extends Activity implements SensorEventListener {


    SensorManager sensorManager;
    private String type;
    private float vektor[]=new float[3];


    public Sensoren(String t){
    type = t;
    }


    public boolean setUpSensor(){


    if (type=="accelerometer"){
    Sensor gravityfield;
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    gravityfield=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, gravityfield, SensorManager.SENSOR_DELAY_NORMAL);
    return false;
    }
    else if (type=="magnetfield"){
    Sensor magnetfield;
    sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
    magnetfield=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    sensorManager.registerListener(this, magnetfield, SensorManager.SENSOR_DELAY_NORMAL);
    return false;
    }
    else return true;

    }


    public float[] getVektor(){
    return vektor;
    }
    @Override public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub

    }


    @Override
    public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    vektor=event.values;
    }
    }


    Besagte Stellen hab ich Rot geschrieben. Hoffe ihr findet es schnell ich verzeifle an dem Ding! ;)


    Gruß Pirate

  • Hier noch die LogCat:
    02-04 16:00:01.385: D/BOINC_GUI(4968): PackageReplacedReceiver: other package: package:de.pirate4888.vario3
    02-04 16:00:06.625: E/AndroidRuntime(24438): at de.pirate4888.3.Sensoren.setUpSensor(Sensoren.java:33)
    02-04 16:00:06.625: E/AndroidRuntime(24438): at de.pirate4888.3.Main.onCreateOptionsMenu(Main.java:35)
    02-04 16:00:06.935: D/CrashAnrDetector(2358): processName: de.pirate4888.vario3
    02-04 16:00:06.940: D/CrashAnrDetector(2358): broadcastEvent : de.pirate4888.vario3 data_app_crash

  • Du brauchst einen Context, am besten beim Erschaffen deiner Klasse übergeben und speichern


    -> bekommst du von der aufrufenden Activity/ bzw auch per getApplicationcontext



    und dann


    Zitat

    sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

  • Du brauchst einen Context, am besten beim Erschaffen deiner Klasse übergeben und speichern


    Das Ding erbt von Activity und dürfte damit sein eigener Context sein.


    Noch was: getSensorManager() kann null zurückliefern, wenn der entsprechende Sensor nicht gefunden wurde.
    Leider ist Dein LogCat nicht informativ genug, man sieht nicht, was genau ihm nicht passt.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ich glaube ja, er enthält uns nicht nur Teile des LogCat vor sondern auch Teile der .java – nämlich die Overrides der interessanten Methoden.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Leider ist Dein LogCat nicht informativ genug, man sieht nicht, was genau ihm nicht passt.


    02-04 16:50:51.251: E/(4770): Device driver API match
    02-04 16:50:51.251: E/(4770): Device driver API version: 23
    02-04 16:50:51.251: E/(4770): User space API version: 23
    02-04 16:50:51.251: E/(4770): mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Wed Oct 9 21:05:57 KST 2013
    02-04 16:50:51.421: E/EnterpriseContainerManager(2358): ContainerPolicy Service is not yet ready!!!
    02-04 16:50:55.431: E/AndroidRuntime(4770): FATAL EXCEPTION: main
    02-04 16:50:55.431: E/AndroidRuntime(4770): java.lang.NullPointerException
    02-04 16:50:55.431: E/AndroidRuntime(4770): at de.pirate4888.gleitschirmvario3.Sensoren.setUpSensor(Sensoren.java:36)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at de.pirate4888.gleitschirmvario3.Main.onCreateOptionsMenu(Main.java:37)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.app.Activity.onCreatePanelMenu(Activity.java:2578)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:507)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:934)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:292)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.view.Choreographer.doCallbacks(Choreographer.java:591)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.view.Choreographer.doFrame(Choreographer.java:560)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.os.Handler.handleCallback(Handler.java:730)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.os.Handler.dispatchMessage(Handler.java:92)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.os.Looper.loop(Looper.java:176)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at android.app.ActivityThread.main(ActivityThread.java:5419)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at java.lang.reflect.Method.invokeNative(Native Method)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at java.lang.reflect.Method.invoke(Method.java:525)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
    02-04 16:50:55.431: E/AndroidRuntime(4770): at dalvik.system.NativeStart.main(Native Method)
    02-04 16:50:56.096: E/android.os.Debug(2358): !@Dumpstate > sdumpstate -k -t -z -d -o /data/log/dumpstate_app_error




    Hoffe da sieht man mehr!


    Hast Du im Manifest die Werte entsprechend Deiner Sensoren eingetragen?
    Link zur Dokumentation

    Hab im Manifest beide Sensoren eingertragen mit dem Namen = android.hardw.......
    und required = True



    Vielen dank schonmal das ihr euch das anschaut.

  • Hatte gedacht das wäre überflüssig ;)


    Die komplette Main.java


    package de.pirate4888.gleitschirmvario3;



    import android.os.Bundle;
    import android.app.Activity;


    import android.view.Menu;
    import android.widget.TextView;


    public class Main extends Activity {



    TextView error;
    TextView magnetVanzeige;
    TextView gravityVanzeige;
    Sensoren magnetfield = new Sensoren("magnetfield");
    Sensoren gravityfield= new Sensoren("gravityfield");

    float[] magvektor= new float[3];
    float[] gravvektor= new float[3];
    boolean errorflag = false;

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    error=(TextView)findViewById(R.id.error);
    magnetVanzeige=(TextView)findViewById(R.id.magnetVanzeige);
    gravityVanzeige=(TextView)findViewById(R.id.gravityVanzeige);

    errorflag=magnetfield.setUpSensor();
    if (errorflag=true) error.setText("Error: Sensor nicht konfigurierbar");
    magvektor=magnetfield.getVektor();
    magnetfield.setDownSensor();
    magnetVanzeige.setText("Magnetfeld Vektor:"+
    "\nX:"+ magvektor[0]+
    "\nY:"+ magvektor[1]+
    "\nZ:"+ magvektor[2]);

    errorflag=gravityfield.setUpSensor();
    if (errorflag=true) error.setText("Error: Sensor nicht konfigurierbar");
    gravvektor=gravityfield.getVektor();
    gravityfield.setDownSensor();

    gravityVanzeige.setText("Gravitations Vektor:"+
    "\nX:"+ gravvektor[0]+
    "\nY:"+ gravvektor[1]+
    "\nZ:"+ gravvektor[2]);

    return true;
    }


    }




    Die Komplette Sensoren.java


    package de.pirate4888.gleitschirmvario3;



    import android.app.Activity;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;


    public class Sensoren extends Activity implements SensorEventListener {


    SensorManager sensorManager;
    private String type;
    private float vektor[]=new float[3];

    public Sensoren(String t){
    type = t;

    }


    public boolean setUpSensor(){

    if (type=="accelerometer"){
    Sensor gravityfield;
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    gravityfield=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, gravityfield, SensorManager.SENSOR_DELAY_NORMAL);
    return false;
    }
    else if (type=="magnetfield"){
    Sensor magnetfield;
    sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
    magnetfield=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    sensorManager.registerListener(this, magnetfield, SensorManager.SENSOR_DELAY_NORMAL);
    return false;
    }
    else return true;

    }

    public void setDownSensor(){
    sensorManager.unregisterListener(this);
    }

    public float[] getVektor(){
    return vektor;
    }
    @Override public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub

    }


    @Override
    public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    vektor=event.values;
    }
    }

  • Marco mag mich jetzt hauen, aber die Ableitung zu einer Activity geht nicht wirklich so...


    onCreate bzw super Methoden werde gar nicht aufgerufen, also gibt es auch keinen Context.


    Pirate die Nullpointerexceptions tauchen ja schon vor onCreateOptionMenu auf und da stehen nur deine Variablen, also kann das so schon mal nicht klappen.
    Mein Vorschalg wäre die Klasse sensoren "sauber" zu machen (weg mit dem Activity quatsch) siehe oben .


    Und dann initalisierst du die am besten erst im onCreate deiner Activity, da kannst du dann auch gleich testen ob es fehlgeschlagen ist (für Geräte ohne Sensoren und die App sauber beeenden)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!