OnSensorChanged не сработало для StepDetector - PullRequest
0 голосов
/ 30 ноября 2018

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

проблема, с которой он сталкивается, заключается в том, что функция OnSensorChange () не вызывается, когда я перемещаю встряхивание или бегаю с устройством.Может ли кто-нибудь указать мне, почему это не работает?

Я использую Xamarin с Visual Studio для Mac.

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Net.Wifi;
using Android.Content;
using System.Linq;
using System.Threading.Tasks;
using System;
using Android.Hardware;
using Android.Util;
using Android.Views;

namespace WiFinder
{
    [Activity(Label = "WiFinder", MainLauncher = true, Icon = "@mipmap/icon")]
    public class MainActivity : Activity, ISensorEventListener
    {
        private bool isRunning = false;
        TextView tex;
        TextView Steps;

        long TotalSteps = 0;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            tex = FindViewById<TextView>(Resource.Id.textView1);
            Steps = FindViewById<TextView>(Resource.Id.textView3);
            RegisterReceiver(new WifiMonitor(), new IntentFilter(WifiManager.ScanResultsAvailableAction));
            ((WifiManager)GetSystemService(WifiService)).StartScan();

            if (!isRunning)
            {
                RegisterListeners(SensorType.StepDetector);
            }

            isRunning = true;
        }

        public void DisplayText(string text)
        {
           tex.Text = "Wifi networks: \r\n" + text;
        }

        void RegisterListeners(SensorType sensorType)
        {

            var sensorManager = (SensorManager)GetSystemService(Context.SensorService);
            var sensor = sensorManager.GetDefaultSensor(sensorType);

            //get faster why not, nearly fast already and when
            //sens  or gets messed up it will be better
            sensorManager.RegisterListener(this, sensor, SensorDelay.Ui);
            Console.WriteLine("Sensor listener registered of type: " + sensorType);

        }
        public void OnAccuracyChanged(Sensor sensor, SensorStatus accuracy)
        {
            //do nothing here
        }

        void UnregisterListeners()
        {

            if (!isRunning)
                return;

            try
            {
                var sensorManager = (SensorManager)GetSystemService(Context.SensorService);
                sensorManager.UnregisterListener(this);
                Console.WriteLine("Sensor listener unregistered.");
#if DEBUG
                Android.Util.Log.Debug("STEPSERVICE", "Sensor listener unregistered.");
#endif
                isRunning = false;
            }
            catch (Exception ex)
            {
#if DEBUG
                Android.Util.Log.Debug("STEPSERVICE", "Unable to unregister: " + ex);
#endif
            }
        }

        public void AddSteps(Int64 count)
        {
            //if service rebooted or rebound then this will null out to 0, but count will still be since last boot.
            if (lastSteps == 0)
            {
                lastSteps = count;
            }
                        //calculate new steps
            newSteps = count - lastSteps;

            //ensure we are never negative
            //if so, no worries as we are about to re-set the lastSteps to the
            //current count
            if (newSteps < 0)
                newSteps = 1;
            else if (newSteps > 100)
                newSteps = 1;


            lastSteps = count;


            TotalSteps += newSteps;
            Steps.Text = TotalSteps.ToString();
        }

        Int64 newSteps = 0;
        Int64 lastSteps = 0;
        public  void  OnSensorChanged(SensorEvent e)
        {
            switch (e.Sensor.Type)
            {

                case SensorType.StepCounter:

                    if (lastSteps < 0)
                        lastSteps = 0;

                    //grab out the current value.
                    var count = (Int64)e.Values[0];

                    AddSteps(count);

                    break;
                case SensorType.StepDetector:
                    count = lastSteps + 1;
                    AddSteps(count);
                    break;
            }
        }
    }
    public class WifiMonitor : BroadcastReceiver
    {
        public override async void OnReceive(Context context, Intent intent)
        {
            var mainActivity = (MainActivity)context;
            var wifiManager = (WifiManager)mainActivity.GetSystemService(Context.WifiService);

            var message = string.Join("\r\n", wifiManager.ScanResults.OrderByDescending((q) => q.Level)
                                      .Select(r => $"{r.Ssid} - {r.Level} dB - Distance: {calculateDistance(Convert.ToDouble(r.Level), Convert.ToDouble(r.Frequency))}"));
            mainActivity.DisplayText(message);
            await Task.Delay(TimeSpan.FromMilliseconds(200));
            wifiManager.StartScan();
        }
        public double calculateDistance(double signalLevelInDb, double freqInMHz)
        {
            double exp = (27.55 - (20 * Math.Log10(freqInMHz)) + (8 - signalLevelInDb) ) / 20.0;
            return Math.Pow(10.0, exp);
        }
    }
}

Я читал другие подобные вопросы, но ни один шов, чтобы решить мою проблему.

заранее спасибо

...