Newbie-Frage: Runden und RSSI

F

funk

Ambitioniertes Mitglied
2
Hallo,

im Grunde hab ich zwei Fragen:
Ich versuch mir gerade eine App zusammen zu pfuschen für meine Dipl.Arbeit.
Leider bin ich ein wirklich grausiger Programmierer (keine Ahnung warum ich
nie den Zugang dazu gefunden hab). Die App arbeitet zum einen mit den
Bewegungssensoren und zum anderen mit Bluetooth (genauer gesagt mit
den RSSI-Werten von Bluetooth-Nachbarn).

Nun meine erste - etwas trivialere - Frage:
Wenn ich mir die Werte des Accelerometer und des Kompass ausgeben lasse,
dann sind diese Werte zwar schön auf 5 (Kompass) bzw. 7 (Acc)
Nachkommastellen genau...das ist aber für meine Ausgabe völlig unnötig!
-> Wie kann ich den ausgegebenen Text auf 2 Nachkommastellen reduzieren?

Die zweite Frage ist dann wohl etwas komplexer:
Ich habe es jetzt geschafft mit
Code:
short rssi = intent.getShortExtra(device.EXTRA_RSSI, Short.MIN_VALUE);
den RSSI-Wert eines gefundenen BT-Nachbarn anzuzeigen, allerdings
meint Eclipse dazu
The static field BluetoothDevice.EXTRA_RSSI should be accessed in a static way
Außerdem hab ich noch nicht ganz den Discovery-Modus von Android
verstanden und wie ich z.B. meiner App sagen kann, dass sie nach
Änderungen im RSSI-Wert schauen und diesen ausgeben soll...

Ich wäre für jede Hilfe dankbar!

Gruß,
Frank

PS: Ich hab jetzt erstmal nicht den kompletten Code angehängt..er
entspricht jedoch in Auszügen dem Android Dev Example Code des
Bluetooth Chats DeviceListActivity.java | Android Developers
 
funk schrieb:
dann sind diese Werte zwar schön auf 5 (Kompass) bzw. 7 (Acc)
Nachkommastellen genau...das ist aber für meine Ausgabe völlig unnötig!
-> Wie kann ich den ausgegebenen Text auf 2 Nachkommastellen reduzieren?

Schau Dir mal NumberFormat an.

funk schrieb:
Die zweite Frage ist dann wohl etwas komplexer:
Ich habe es jetzt geschafft mit
Code:
short rssi = intent.getShortExtra(device.EXTRA_RSSI, Short.MIN_VALUE);
den RSSI-Wert eines gefundenen BT-Nachbarn anzuzeigen, allerdings
meint Eclipse dazu
The static field BluetoothDevice.EXTRA_RSSI should be accessed in a static way
Du greifst über device.EXTRA_RSSI auf die Konstante EXTRA_RSSI zu (also über eine Instanz der Klasse BluetoothDevice). Diese solltest Du aber über die Klasse direkt referenzieren (also statisch). Also so: BluetoothDevice.EXTRA_RSSI.
Das ist im übrigen nur eine Warning und kein Compile-Error. Also nur schlechter Stil, aber nicht komplett falsch.

SirMArtin
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank schon mal für die Tipps und Hinweise!

und: schlechten Stil will ich ja auch auf jeden Fall vermeiden, mir
war nur nicht klar, wo da jetzt der "Fehler" lag!

Danke und Gruß,
Frank
 
Hey,

sorry wenn das echt doofe Fragen sind, aber ich hab jetzt meinen Code um
den Accelerometer auszulesen versucht mit NumberFormat aufzupeppen und
bekomm dann nur die Meldung, dass die Anwendung beendet werden muss...

Code:
private SensorEventListener accellistener = new SensorEventListener() {
            public void onSensorChanged(SensorEvent e_accel) {      
                if (e_accel.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                    // geänderter Teil
                    NumberFormat nf = NumberFormat.getNumberInstance();
                    nf.setMinimumFractionDigits(0);
                    nf.setMaximumFractionDigits(2);
                    // Ende geänderter Formatierungsteil
                    
                    xAccel.setText(getString(R.string.accx) + ": " + nf.format(String.valueOf(e_accel.values[0])));

                    // so lief die Ausgabe bisher mit 7 Dezimalstellen
                    yAccel.setText(getString(R.string.accy) + ": " + String.valueOf(e_accel.values[1]));
                      
                    }
                }

Ist das vom Ansatz her schon hoffnungslos, oder sollte ich das nicht in
der EventListener-Methode machen, oder gibt es sonst noch Hinweise?

Danke schon mal und Gruß,
Frank

PS: Diese Änderung bewirkt das Abbrechen...
 
Ohne Fehlermeldung ist natürlich schwer etwas zu sagen. Schau mal in die LogCat-View und poste mal die Exception. Wenn keine Exception zu sehen ist, bau mal folgenden try-catch-Block ein. (Disclaimer: das Fangen von der generellen Exception ist auch unschöner Stil, aber zur temporären Fehler-Suche durchaus hilfreich...)

Code:
private SensorEventListener accellistener = new SensorEventListener() {
    public void onSensorChanged(SensorEvent e_accel) {      
        try {
            if (e_accel.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                // geänderter Teil
                NumberFormat nf = NumberFormat.getNumberInstance();
                nf.setMinimumFractionDigits(0);
                nf.setMaximumFractionDigits(2);
                // Ende geänderter Formatierungsteil

                xAccel.setText(getString(R.string.accx) + ": " + nf.format(String.valueOf(e_accel.values[0])));

                // so lief die Ausgabe bisher mit 7 Dezimalstellen
                yAccel.setText(getString(R.string.accy) + ": " + String.valueOf(e_accel.values[1]));
            }
        } catch (Exception e) {
            Log.e("MyApp", "Unknown Error", e);
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Neuer Versuch - daher Doppel-Post...

Ich hab jetzt den Code noch etwas geändert:

Code:
    TextView xAccel = null;
    TextView xTemp = null;




   private SensorEventListener accellistener = new SensorEventListener() {
            public void onSensorChanged(SensorEvent e_accel) {      
                if (e_accel.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                    
                    String temp_x = String.valueOf(e_accel.values[0]);
                    Double temp_x_double = new Double (temp_x);
                    
                    NumberFormat nf = NumberFormat.getNumberInstance();
                    nf.setMinimumFractionDigits(0);
                    nf.setMaximumFractionDigits(2);
                    temp_x = nf.format(temp_x_double);
                    
                    xAccel.setText(getString(R.string.accx) + ": " + temp_x);
                    }
             }

            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //nicht genutzt
                }
            };
Ergebnis: jetzt formatiert er mir die Werte der X-Achse des Accel schön
mit zwei Nachkommastellen...und bringt dann das Telefon komplett zum
Abstürzen!!

Das scheint wohl nicht der Weg zu sein..

Tante Edith meint: Und es geht doch! Nachdem ich das ganze nochmal genauso
kompiliert hab funktioniert das Ganze wohl doch...auch ohne kompletten Systemabsturz!

trotzdem hier der Log Cat Text zu vorheriger Version

03-04 13:09:32.460: VERBOSE/BluetoothEventRedirector(1238): Received android.bluetooth.adapter.action.DISCOVERY_STARTED
03-04 13:09:32.616: INFO/ActivityManager(1164): Displayed activity de.zeh.android.Sensors/.Sensors: 560 ms (total 560 ms)
03-04 13:09:33.577: DEBUG/AndroidRuntime(1639): Shutting down VM
03-04 13:09:33.577: WARN/dalvikvm(1639): threadid=3: thread exiting with uncaught exception (group=0x4001b170)
03-04 13:09:33.577: ERROR/AndroidRuntime(1639): Uncaught handler: thread main exiting due to uncaught exception
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): java.lang.IllegalArgumentException
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at java.text.DecimalFormat.format(DecimalFormat.java:801)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at java.text.Format.format(Format.java:147)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at de.zeh.android.Sensors.Sensors$2.onSensorChanged(Sensors.java:126)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:435)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at android.os.Looper.loop(Looper.java:123)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at android.app.ActivityThread.main(ActivityThread.java:4338)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at java.lang.reflect.Method.invokeNative(Native Method)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at java.lang.reflect.Method.invoke(Method.java:521)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-04 13:09:33.600: ERROR/AndroidRuntime(1639): at dalvik.system.NativeStart.main(Native Method)
03-04 13:09:33.608: INFO/Process(1164): Sending signal. PID: 1639 SIG: 3
03-04 13:09:33.616: INFO/dalvikvm(1639): threadid=7: reacting to signal 3
03-04 13:09:33.616: INFO/dalvikvm(1639): Wrote stack trace to '/data/anr/traces.txt'
 
Zuletzt bearbeitet:

Ähnliche Themen

M
Antworten
2
Aufrufe
611
Mozart40
M
R
  • Gesperrt
  • roland-senior
Antworten
2
Aufrufe
789
Fulano
Fulano
A
Antworten
1
Aufrufe
570
swa00
swa00
Zurück
Oben Unten