2010-05-24 5 views
2

Je code:Obtenir des données provenant de capteurs Android sans Listeners

public class readSensorsData extends Activity implements SensorListener { 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sm = (SensorManager) getSystemService(SENSOR_SERVICE);  

} 
@Override 
public void onSensorChanged(int sensor, float[] values) { 
    synchronized (this) { 
     if (sensor == SensorManager.SENSOR_ORIENTATION) { 

     //get orientation  

     } 
     if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 

     //get acceleration 
      }     

     } 
     if (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) { 

     //get magnetic fiels 
      }  
    Bundle bundle = new Bundle(); //results from activity 
    bundle.putFloatArray("acceleration", array); 

    Intent mIntent = new Intent(); 
    mIntent.putExtras(bundle); 
    setResult(RESULT_OK, mIntent); 
    finish(); 
     } 

    public void onAccuracyChanged(int sensor, int accuracy) { 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    sm.registerListener(this, 
      SensorManager.SENSOR_ORIENTATION | 
     SensorManager.SENSOR_ACCELEROMETER | 
     SensorManager.SENSOR_MAGNETIC_FIELD, 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
protected void onStop() { 
    sm.unregisterListener(this); 
    super.onStop(); 


    } 
} 
Code

fonctionne, mais ici va mon problème: quand je l'appelle de l'activité principale de cette façon:

 Intent i = new Intent(this, readSensorsData.class); 
    startActivityForResult(i, 1); //1 is for sensors  
    for(int j=0;j<10;j++) 
    { 
       //do sth else here!!!! 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException e) {e.printStackTrace();} 
     //here code for showing result from sensor activity 

    } 

puis je peux voir 10 fois le résultat de 'faire sth else !!!' et quand la boucle est finie je peux voir alors le résultat de l'activité. L'activité du capteur attend donc pour une raison quelconque et lorsque l'activité principale n'a plus rien à faire, les capteurs font leur travail.

bien sûr, je l'ai bien mis en œuvre: onActivityResult (int requestCode, int resultCode, l'intention Intent)

Je veux lire les données sensord directement, sans l'aide d'écouteurs, est-il possible?

Répondre

2

D'abord, jamais appel Thread.sleep() dans le thread d'application principale. En deuxième lieu, startActivityForResult() est asynchrone. L'autre activité n'aura pas démarré lorsque startActivityForResult() reviendra. Troisièmement, les événements de capteur sont asynchrones.

activité Alors capteur attend pour une raison

Il ne peut pas commencer jusqu'à ce que vous obtenez sur le thread principal de l'application, qui est liée par vos Thread.sleep() appels.

puis lorsque l'activité principale n'a rien à faire, les capteurs font leur travail.

Précisément.

Je souhaite lire directement les données de la sonde, sans utiliser d'écouteurs, est-ce possible?

Non. Utilisez simplement les programmes d'écoute correctement. Here are three sample projects montrant l'utilisation d'auditeurs de capteurs.

+0

dans ces exemples vous utilisez juste 1 activité pour 1 capteur Je veux envoyer en utilisant le paquet d'information Wi-Fi à cette inclusion, orientation, accélération etc, donc outre le fait que je ne peux pas utiliser thread.sleep() i encore ne sais pas comment obtenir ces données à partir de capteurs, puis-je appeler startActivityForResult plusieurs fois, permet de dire en boucle 1000 fois, commencer cette activité et détruire .. et ainsi de suite. À mon avis, ce n'est pas efficace alors comment puis-je le résoudre? Peut-être utiliser le service? – questioner

+0

hmm, je pense que je sais, je vais utiliser thread pour travailler avec ces capteurs – questioner

+0

Si vous souhaitez agréger ou moyenne des données sur 1000 rapports, il suffit de les ajouter à un ArrayList ou quelque chose dans 'onSensorChanged()'. Lorsque le 1000ème rapport arrive, utilisez une 'AsyncTask' pour effectuer vos calculs (le cas échéant) et envoyer les données à votre serveur. – CommonsWare

Questions connexes