2016-03-13 10 views
-1

У меня есть код, который позволяет подсчитать, сколько раз пользователь слишком быстро поворачивается. Я реализовал гироскоп и несколько кодов, работающих в рамках Возобновить, собирал данные вместе с некоторыми речевыми выходами. Однако у меня возникают проблемы с правильной работой гироскопа внутри onResume. Во-первых, голосовые выходы не работают должным образом и выходят из строя. Затем я все еще не получаю значения для гироскопа.Как я могу получить доступ к гироскопу из onResume?

package com.example.shivamgandhi.gyrosafe; 

import android.content.Context; 
import android.content.Intent; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class Balance_Test_Activity extends VoiceControl implements View.OnClickListener, SensorEventListener, View.OnTouchListener { 

    int n = 2; 
    Button btnarray[] = new Button[n]; 
    private SensorManager mSensorManager; 
    private Sensor default_gyro; 
    private TextView textView79; 
    RelativeLayout RelativeLayout; 
    int count1 = 0; 
    float axisX, axisY, axisZ; 
    double omegaMagnitude; 
    EditText ed29; 
    private static final float NS2S = 1.0f/1000000000.0f; 
    private final float[] deltaRotationVector = new float[4]; 
    int touch = 0; 

    int count2 = 0; 
    int time1 = 0; 
    int time2 = 0; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.balance_test); 

     RelativeLayout = (RelativeLayout)findViewById(R.id.RelativeLayout4); 

     btnarray[0] = (Button)findViewById(R.id.button10); 
     btnarray[1] = (Button)findViewById(R.id.button20); 

     mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
     default_gyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

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

     ed29 = (EditText)findViewById(R.id.editText29); 

     for(int i = 0; i <n; i++){ 
      btnarray[i].setOnClickListener(this); 
     } 

     RelativeLayout.setOnTouchListener(this); 

    } 

    //when this Activity starts 
    @Override 
    protected void onResume() 
    { 
     super.onResume(); 

     if (touch == 1){ 
      try{ 
       speakWords("Please place your hands on your hips and keep your feet under your shoulders. Hold your balance for the next 20 seconds"); 
       Thread.sleep(2000); 
       while(time1 < 334){ 
        mSensorManager.registerListener(this, default_gyro, SensorManager.SENSOR_DELAY_UI); 
        if(omegaMagnitude > 2){ 
         count1 ++; 
         time1 ++; 
        } 
        else{ 
         time1 ++; 
        } 
       } 
       Thread.sleep(2000); 
       speakWords("Place your hands by your side. Tap to continue."); 
       Thread.sleep(1000); 
       touch = 10; 
      } 
      catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 

     if (touch == 2){ 
      speakWords("Please place your hands on your hips and stand on your nondominant foot for the next 20 seconds"); 
      while(time2 < 334){ 
       mSensorManager.registerListener(this, default_gyro, SensorManager.SENSOR_DELAY_UI); 
       if(omegaMagnitude > 2){ 
        count2 ++; 
        time1 ++; 
       } 
       else{ 
        time1 ++; 
       } 
      } 
      speakWords("You may resume normal stance now"); 
      touch = 20; 
     } 


    } 

    @Override 
    protected void onStop() 
    { 
     //unregister the sensor listener 
     mSensorManager.unregisterListener(this); 
     super.onStop(); 
    } 

    @Override 
    public void onClick(View v){ 
     if(v == findViewById(R.id.button10)){ 
      Intent myIntent = new Intent(this, Results_Page_Activity.class); 
      startActivity(myIntent); 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event){ 
     if(v == RelativeLayout){ 
      if(touch == 0){ 
       touch = 1; 
       onResume(); 
       return true; 
      } 
      else if (touch == 10){ 
       touch = 2; 
       onResume(); 
       return true; 
      } 
      return true; 
     } 
     else{ 
      return false; 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    { 
     //Do nothing. 
    } 


    public void onSensorChanged(SensorEvent event) { 
     // This timestep's delta rotation to be multiplied by the current rotation 
     // after computing it from the gyro sample data. 

     // Axis of the rotation sample, not normalized yet. 
     float axisX = event.values[0]; 
     float axisY = event.values[1]; 
     float axisZ = event.values[2]; 

     // Calculate the angular speed of the sample 
     double omegaMagnitude = Math.sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ); 

     float[] deltaRotationMatrix = new float[9]; 
     SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); 

     textView79.setText("Gyro X (Roll) :" + Float.toString(event.values[2]) + "\n" + 
       "Gyro Y (Pitch) :" + Float.toString(event.values[1]) + "\n" + 
       "Gyro Z (Yaw) :" + Float.toString(event.values[0])); 
    } 
} 

Как я могу идти о фиксации этого кода, так что я могу реально получить значения из гироскопа? Спасибо заранее

+0

Это ** в третий раз, когда вы задали этот вопрос **, и вы не получите полезный ответ, пока не прекратите удалять свои вопросы и не столкнетесь с основными фактами, которые они раскрывают. Вы ** не можете ** получить данные датчика в методе жизненного цикла, и вы ** не можете ** иметь длинный цикл работы в методе жизненного цикла. Как вам сказали в последний раз, когда вы спросили об этом, вам нужно получить данные в обратном вызове датчика, а затем вы можете почтовый ящик туда, где это необходимо. Если вам нужен длинный цикл, вам придется использовать один из механизмов фонового потока. –

+0

Во-первых, я изменил свой код и полностью изменил вопрос, поэтому я не задавал тот же вопрос. Вы не увидите комментариев, которые отвечали бы на мой вопрос по любым другим вопросам, которые я задал. Все, что я спросил, это то, что нужно уточнить, почему мой код плох. Вы не опубликовали решение моего вопроса или не указали способ, которым я могу найти решение. Я удалил один вопрос, который стал излишним после того, как я значительно изменил свой код и узнал, что делаю серьезную ошибку. Просьба представить некоторые формы руководства, как я могу идти вперед, а не атаковать. – sjgandhi2312

+0

Ваши изменения не изменили ** фундаментальную проблему ** с вашим подходом, а просто переместили ее безрезультатно. Вам сказали, как его решить, но вы проигнорировали это и исключили вопрос, в котором вам сказали. Теперь вам снова сказали одно и то же - в ответе, который вы приняли, хотя вы все еще не согласны с тем, что на самом деле говорит вам о том, как вам придется полностью изменить организацию вашей программы на управляемая событиями модель. –

ответ

0

Хорошо, несколько вопросов здесь.

1) Никогда не спите в onResume или где-либо еще в потоке пользовательского интерфейса. Вы не можете так держать. В лучшем случае это приведет к тому, что вы выглядите так, как будто вы разбились, а в худшем случае это может произойти из-за сторожевого пса. Это почти никогда не будет делать то, что вы хотите.

2) Вы никогда на самом деле установка imegaMagnitude, потому что вы его заново в onSensorChanged

3) Вы не увидите правильное значение в любом случае, потому что он не будет установлен, пока onSensorChanged не называется. Поскольку это вызвано только потоком пользовательского интерфейса, он не будет вызываться до тех пор, пока onResume не закончит работу (см. 1). Таким образом, ваш код никогда не сможет работать.

4) Вы не можете позвонить по телефону самостоятельно. Только структура разрешена для вызова функций жизненного цикла. Сделав это, вы серьезно повредите ситуацию.

Ваш подход совершенно неприемлем. Перепишите свою логику, чтобы использовать обработку на основе событий и шаблон состояния. Этот код не сбрасывается.

+0

Как вы предлагаете мне создать новый код? Сначала я попытался создать код, создав новую функцию gyrotest со сном, но я узнал, что я не могу получить доступ к гироскопу оттуда. – sjgandhi2312