2015-04-27 2 views
0

Я пишу приложение, которое показывает показания акселерометра, вчера я смог написать весь код акселерометра в основном действии, и он отлично работает на эмуляторе и моем устройстве.код акселерометра в классе

Но сегодня я пытался создать класс, содержащий весь код акселерометра, и вернуть три целых числа X, Y, Z только в целочисленном массиве, поэтому я делаю код, который, я думаю, прав, но каждый Я запускаю проект на эмуляторе, и он всегда дает мне 0, 0,0. Так что я хочу помочь, пожалуйста.

код активности ::

package com.example.accelerometer_sensor; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    int [] AccVal = new int[3]; 

    TextView acceleration; 

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

     AccelerometerClass acc = new AccelerometerClass(); 
     acc.AccelerometerInit(this); 
     AccVal =acc.Vals; 

     acceleration = (TextView)findViewById(R.id.acceleration); 


     acceleration.setText("X: "+acc.Vals[0]+ 
        "\nY: "+acc.Vals[1]+ 
        "\nZ: "+acc.Vals[2]); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


} 

accelerometerClass:

package com.example.accelerometer_sensor; 

import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 

public class AccelerometerClass implements SensorEventListener 
{ 
    int [] Vals = new int[3]; 
    Sensor accelerometer; 
    SensorManager sm; 

    public void AccelerometerInit(Context context) 
    { 

     sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);  
     accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onResume() { 

     sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

    } 

    protected void onPause() { 

     sm.unregisterListener(this); 
    } 

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

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 

     Vals[0]=(int)event.values[0]; 
     Vals[1]=(int)event.values[1]; 
     Vals[2]=(int)event.values[2]; 
    } 


} 

пожалуйста, я застрял в этой проблемой по времени, любая помощь будет признателен.

+2

Я думаю, StackOverflow, тем лучше место для этого вопроса. – Evorlor

+0

Как настроен ваш эмулятор? Возможно, вам следует проверить свой код на реальном телефоне или посмотреть на этот вопрос: [Как смоделировать акселерометр в эмуляторе Android?] (Http://stackoverflow.com/questions/3921467/how-can-i-simulate- акселерометр-в-android-эмулятор) – martijnn2008

ответ

0

Я подозреваю, что текст записывается до того, как происходит событие onSensorChanged. Так он идет, как это ...

  1. Регистрация слушателем
  2. Написать текст (все 0s в этой точке)
  3. пожаров событий и изменяет х, у, г значения

текст уже написан, хотя значения не обновляются. Я мог ошибаться, но вы можете проверить это, остановив поток на несколько секунд, прежде чем записывать значения в текстовое поле с Thread.sleep(2000); 2000 в миллисекундах.

Возможно также, что мероприятие не стреляет. Вы можете проверить это, добавив строку внутри метода onSensorChanged(), который регистрируется на вашем logcat.

Log.d(TAG, "onSensorChanged method has been invoked"); 

Редактировать: Я просто запустил его. Все работает нормально, но вы не получаете желаемых результатов, потому что текст записывается до того, как будет запущено событие. Вам необходимо обновить свой интерфейс, когда вызывается метод onSensorChanged().

+0

Благодарим вас за ответ, но можете ли вы рассказать мне, как я могу обновить UI ??! спасибо – user3903128

0

Реализовать getter метод для объекта Vals в AccelerometerClass

public class AccelerometerClass implements SensorEventListener 
{ 
    int [] Vals = new int[3]; 
    Sensor accelerometer; 
    SensorManager sm; 
public AccelerometerClass(Context context) 
{ 

    sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);  
    accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
} 

... 

// getter method 
public int getValue(int index) { 
    return this.Vals[index]; 
} 

}

доступ к нему из MainActivity:

public class MainActivity extends Activity { 

    int [] AccVal = new int[3]; 

    TextView acceleration; 

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

     // this one will call constructor of AccelerometerClass and initialise sensors 
     AccelerometerClass acc = new AccelerometerClass(getApplicationContext()); 



     acceleration = (TextView)findViewById(R.id.acceleration); 

     // access like this here 
     acceleration.setText("X: "+acc.getValue(0)+ 
        "\nY: "+acc.getValue(1)+ 
        "\nZ: "+acc.getValue(2)); 
    } 
} 

Это позволит решить вашу проблему

+0

я сделал, как вы упомянули выше, но это еще 3 нули на эмуляторе ??! любая helppp пожалуйста – user3903128

+0

Вы получаете событие 'onSensorChanged'?Поместите лог внутри этого события, чтобы проверить – Kushal

+0

сэр, я поместил эту строку в метод onsensorChanged(): Log.d (TAG, «onSensorChanged метод был вызван»); , и когда я пытаюсь нормально запустить приложение на эмуляторе, оно дает мне нагрузочный знак (круговая загрузка), и ничего не появляется. ?! что это значит? – user3903128

Смежные вопросы