2016-10-24 2 views
0

Привет У меня есть большая проблема, тоже получают данные от нескольких датчиков моего кода для регистра и чтение данных является:несколько датчиков данных Xamarin Android

[Service] 
    class BackgroundServiceSensoren : Service 
    { 
    StepDetector sd; 
    Azimut az; 
    double obererSchwellenWert = 2.0; 
     double untererSchwellenWert = -2.0; 
    Boolean timerFlag = false; 

    public override IBinder OnBind(Intent intent) 
    { 
     return null; 
    } 
     public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     Task.Run(() => 
     { 
     sd = new StepDetector(obererSchwellenWert, untererSchwellenWert, timerFlag, 0); 
      az = new Azimut(); 

      var mSensorManager1 = (SensorManager)Application.Context.GetSystemService(Context.SensorService); 
      var mSensorManager2 = (SensorManager)Application.Context.GetSystemService(Context.SensorService); 
      var mLinearAccelerometer = mSensorManager1.GetDefaultSensor(SensorType.LinearAcceleration); 
      // mSensorManager1.RegisterListener(sd, mLinearAccelerometer, SensorDelay.Fastest); 
      var mAzimutMagneticField = mSensorManager2.GetDefaultSensor(SensorType.MagneticField); 
      var mAzimutAccelerometer = mSensorManager2.GetDefaultSensor(SensorType.Accelerometer); 

      mSensorManager2.RegisterListener(az, mAzimutMagneticField, SensorDelay.Game); 
       mSensorManager2.RegisterListener(az, mAzimutAccelerometer, SensorDelay.Fastest); 


     }); 
     return StartCommandResult.Sticky; 
    } 

class Azimut : Java.Lang.Object, ISensorEventListener 
{ 
    float [] mGravity; 
    float [] mGeomagnetic; 
    float azimut; 



    public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy) 
    { 

    } 

public void OnSensorChanged(SensorEvent e) 
    { 
     Sensor mySensor = e.Sensor; 

     if (mySensor.Type == SensorType.Accelerometer) 
     { 
      if (mGravity == null) 
      { 
       mGravity = new float[3]; 
      } 
      e.Values.CopyTo(mGravity, 0); 


     } 
     if (mySensor.Type == SensorType.MagneticField) 
     { 
      if(mGeomagnetic == null){ 
       mGeomagnetic = new float[3]; 
      } 
      e.Values.CopyTo(mGeomagnetic,0); 


     } 

     if (mGeomagnetic != null && mGravity != null) 
     { 
      float[] R = new float[9]; 
      float[] I = new float[9]; 
      bool success = SensorManager.GetRotationMatrix(R, I, mGravity, mGeomagnetic); 
      if (success) 
      { 
       float[] orientation = new float[3]; 
       SensorManager.GetOrientation(R, orientation); 
       azimut = orientation[0]; 
       Xamarin.Forms.Device.BeginInvokeOnMainThread(() => 
       { 
        Toast.MakeText(Application.Context, azimut.ToString(), ToastLength.Short).Show(); 
       }); 

      } 
     } 
    } 

Но я получаю только значение от акселерометра, но как я могу получить значение от акселерометра и магнитного поля

+0

Какой уровень API вы пытаетесь протестировать? –

+0

моей мин апи 15, но я проверить его на 23 –

ответ

0

Не уверено, что о разрешениях на API 23, но на моем старом телефоне я получаю оба уведомления:

public class MainActivity : FormsApplicationActivity, ISensorEventListener 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     var mSensorManager = (SensorManager)Application.Context.GetSystemService(Context.SensorService); 
     var mAzimutMagneticField = mSensorManager.GetDefaultSensor(SensorType.MagneticField); 
     var mAzimutAccelerometer = mSensorManager.GetDefaultSensor(SensorType.Accelerometer); 
     if (mAzimutMagneticField != null) 
      mSensorManager.RegisterListener(this, mAzimutMagneticField, SensorDelay.Fastest); 
     if (mAzimutMagneticField != null) 
      mSensorManager.RegisterListener(this, mAzimutAccelerometer, SensorDelay.Fastest); 
    } 

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) 
    { 
     base.OnRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

    public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy) 
    { 

    } 

    public void OnSensorChanged(SensorEvent e) 
    { 
     if (e.Sensor.Type == SensorType.MagneticField) 
     { 
      var magn = e.Values[0]; 
     } 
     if (e.Sensor.Type == SensorType.Accelerometer) 
     { 
      var acc = e.Values[0]; 
     } 
    } 

} 

enter image description here

+0

общественного переопределения недействительного OnRequestPermissionsResult (INT requestCode, строка [] разрешение, [GeneratedEnum] Введена [] grantResults) { base.OnRequestPermissionsResult (requestCode, разрешение, grantResults); } –

+0

Для чего это общедоступное переопределение void OnRequestPermissionsResult (int requestCode, string [] permissions, [GeneratedEnum] Permission [] grantResults) { base.OnRequestPermissionsResult (requestCode, permissions, grantResults); } –

+0

Это функция ISensorEventListener. Вы должны реализовать его, если вы реализуете ISensorEventListener –

0

нормально У меня есть решение старый код:

mSensorManager2.RegisterListener(az, mAzimutMagneticField, SensorDelay.Game); 
    mSensorManager2.RegisterListener(az, mAzimutAccelerometer, SensorDelay.Fastest); 

новый код:

mSensorManager2.RegisterListener(az,(Sensor) mAzimutMagneticField, SensorDelay.Game); 
    mSensorManager2.RegisterListener(az,(Sensor)mAzimutAccelerometer, SensorDelay.Fastest); 

Я не знаю, почему датчик необходимо подавать на датчик, но он работает me

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