я пытаюсь прочитать 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);
}
}
}
Я читал другие подобные вопросы, но ни один шов, чтобы решить мою проблему.
заранее спасибо