Android Accelerometer сенсоры, аномальдық мәндер/глектер

Мен сынақ телефонындағы акселерометрлер үшін (Nexus S) сенсорлар API пайдалануға тырысамын. Үстелде отырған телефонмен ештеңе жасамаса, мен өте таңғажайып оқылымдарды (суретті қоса) алады. Мұндай мінез-құлықты кез-келген адам көрген бе? Жылдам оқиды деген сөздері ? Онымен қалай күресуге болатыны туралы кез-келген ой.

   package com.example.m6;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Calendar;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
//import android.widget.Toast;

public class HelloAndroidActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager; 
    private TextView tv;
    private float accel[] = {0,0,0};
    private float gyro[] = {0,0,0};


    InetAddress addr; 
    int port         = 1337;
    DatagramSocket s = null;
    String out       = "";
    PowerManager.WakeLock wl;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        try{
            //Lock the screen 
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            //Set up the output screen
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.textview);
            tv.setBackgroundColor(Color.BLACK);
            tv.setTextColor(Color.GREEN);

            //Set up the telemetry feed 
            addr = InetAddress.getByName("192.168.0.12");
            s = new DatagramSocket();

            //Turning off the power management!!
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag");
            wl.acquire(); 

            //Set up the sensors
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

            out += "Done\n";
            tv.setText(out);

        } catch (Exception e) {
            out += "\nInit Error:" + e.getMessage() + "\n";
            tv.setText(out);
        }

    }

    private static final float NS2S = 1.0f/1000000000.0f;
    private float timestamp;

    int down = 0; 
    float tstart = 0;
    @Override
    public void onSensorChanged(SensorEvent event) {            

        String type = "";
        float dT = 0;       
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            if (timestamp != 0) {
                accel = event.values;
                dT = (event.timestamp - timestamp);
                tstart += dT;
            }
            timestamp = event.timestamp;
            type = "G";
        }

        if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            if (timestamp != 0) {
                gyro = event.values;
                dT = (event.timestamp - timestamp);
                tstart += dT;
            }
            timestamp = event.timestamp;
            type = "A";
        }

        String out_packet = tstart/1000/1000 + " "+ type + " " + dT + " " + accel[0] + " " + accel[1] + " " + accel[2] + " " + gyro[0] + " " + gyro[1] + " " + gyro[2] + "\n\0";

        try{
            DatagramPacket p = new DatagramPacket(out_packet.getBytes(),out_packet.length(), addr,port);
            s.send(p);
        }
    catch (Exception e) {
            out += "Packet send error: " + e.getMessage() + "\n";
        }

        tv.setText(timestamp + "\n" + out);
    }

    @Override
    protected void onResume() {
        super.onResume();
        out += "on resume\n";
        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
        tv.setText(out);
    }

    @Override
    protected void onPause() {
        out += "on pause";
        sensorManager.unregisterListener(this);
        tv.setText(out);
        super.onStop();

    }

    @Override
    protected void onDestroy() {
        out += "on destroy";
        wl.release();
        tv.setText(out);
        super.onDestroy();
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
       //TODO Auto-generated method stub

    }
}
0
Droid 1-ні қолданғанда, мен мұндай аномалияларды байқамадым. Мен әрдайым табуға болатын нәрселерді (қозғалыс тізбегін) қолдануға мәжбүр болдым, алайда «кез келген» қозғалыс оқиғаларын анықтауға тырыспадым.
қосылды автор Matt H, көзі
Мен кодты қостым. Мен тыңдап отырған оқиғалар туралы пайдалы болады деп үміттенемін.
қосылды автор MattieG, көзі

2 жауаптар

Коды жақсы болар еді .. бұл демо-кодты көріңіз. Мен білемін, ол жұмыс істейді және график жасайды.

http://www.5laida.com/docs/android/samples/Sensors.html

Мен осы кодты бірнеше құрылғыларда сынап көрдім. Егер бірдей глотокстер көрсетілсе, онда сіздің құрылғыңыз бәлкім.

0
қосылды
Иә әрине! Бұл мені глупо. Дерек көзін қосу туралы сұрақты өңдедіңіз. Мен сізді ескертемін, мен негізінен C/C ++ әзірлеушімін, менің Java өте ржавый. Мүмкін, кодексте дұрыс емес нәрсе жасаймын. Менде бұл тілде түйсік жоқ.
қосылды автор MattieG, көзі

Мен не болып жатқанын түсіндім. Бұл сызықты қосу керек болды:

        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE ){
        return;
    }

Алайда, мұны істеу арқылы мен гироскоптан құндылықтарды алмаймын. Хм ...

0
қосылды
Мен event.accuracy немесе Sensor_Status_unrelaible үшін қайнар көзді қарап шықпаймын .. бірақ оқиғаны істейді. Сандық мәнді теңестіремін .. бұл мүмкін шекті мәнді орнатуға болады. Графикке қарап, бұл мәселе толық тамшылар. Өзгерістер тез және қатал болса, өзгерістер енгізуді болдырмау үшін әрқашан кейбіреулермен сөйлесуге болады. Барлық құрылғыларға қолдау көрсету қиын, әсіресе ОЖ ерекшеленсе де, жеке телефон құрастырудың сапасы.
қосылды автор DJPlayer, көзі
Шешіміңізді құттықтаңыз. Сіз қолдана алсаңыз, басқалардың сізден табысқа жетуі үшін жауапты «қабылданған» деп белгілеңіз. Көңілділер ~
қосылды автор Andrew Kozak, көзі
Бұл сұраққа жауап мынада: stackoverflow.com/questions/5985514/…
қосылды автор MattieG, көзі