我正在创建一个收集sensordata的Xamarin应用程序,以便我可以使用机器学习进行实验。该应用程序在后台使用intentservice ..但几秒钟后,我收到以下错误:
03-23 21:31:14.772 I / zygote64(18051):线程[3,tid = 18057,WaitingInMainSignalCatcherLoop,Thread * = 0x7dabcc0400,peer = 0x13fc0088,“Signal Catcher”]:对信号3作出反应 03-23 21:31:14.772 I / zygote64(18051): 03-23 21:31:14.772 E / zygote64(18051):#HandleSigQuit#DumpForSigQuit#before#pid = 18051 03-23 21:31:14.879 E / zygote64(18051):#HandleSigQuit #DumpForSigQuit#after#pid = 18051 03-23 21:31:14.883 I / zygote64(18051):将堆栈跟踪写入'/data/anr/traces.txt'
我在使用Android 8.0.0的Oneplus 3T上进行调试。 使用sqlite-net ORM将sensordata直接写入sqlite数据库。
我已经尝试了9个小时的调试..但我无法修复错误。 当我评论出服务时......它没有给我任何错误。
这就是我的服务的样子:
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Hardware;
using Tabi.DataStorage;
using Tabi.DataObjects;
namespace Tabi.Droid.CollectionService
{
[Service]
public class SensorService : IntentService, ISensorEventListener
{
private readonly ISensorRepository<Accelerometer> _accelerometerRepository;
private readonly ISensorRepository<Gyroscope> _gyroscopeRepository;
private readonly ISensorRepository<Magnetometer> _magnetometerRepository;
private readonly ISensorRepository<LinearAcceleration> _linearAccelerationRepository;
private readonly ISensorRepository<Orientation> _orientationRepository;
private readonly ISensorRepository<Quaternion> _quaternionRepository;
private readonly ISensorRepository<Gravity> _gravityRepository;
public SensorService()
{
_accelerometerRepository = App.RepoManager.AccelerometerRepository;
_gyroscopeRepository = App.RepoManager.GyroscopeRepository;
_magnetometerRepository = App.RepoManager.MagnetometerRepository;
_linearAccelerationRepository = App.RepoManager.LinearAccelerationRepository;
_orientationRepository = App.RepoManager.OrientationRepository;
_quaternionRepository = App.RepoManager.QuaternionRepository;
_gravityRepository = App.RepoManager.GravityRepository;
}
public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
{
}
public void OnSensorChanged(SensorEvent e)
{
//start gathering data and push to SqliteDB
switch (e.Sensor.Type)
{
case SensorType.Accelerometer:
_accelerometerRepository.Add(new Accelerometer()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
break;
case SensorType.Gyroscope:
_gyroscopeRepository.Add(new Gyroscope()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
break;
case SensorType.MagneticField:
_magnetometerRepository.Add(new Magnetometer()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
break;
case SensorType.Orientation:
_orientationRepository.Add(new Orientation()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2]
});
break;
case SensorType.Gravity:
_gravityRepository.Add(new Gravity()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2]
});
break;
case SensorType.LinearAcceleration:
_linearAccelerationRepository.Add(new LinearAcceleration()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2]
});
break;
case SensorType.RotationVector:
_quaternionRepository.Add(new Quaternion
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
W = e.Values[3]
});
break;
default:
break;
}
}
protected override void OnHandleIntent(Intent intent)
{
var sensorManager = (SensorManager)Application.Context.GetSystemService(Context.SensorService);
Sensor accelerometer = sensorManager.GetDefaultSensor(SensorType.Accelerometer);
sensorManager.RegisterListener(this, accelerometer, SensorDelay.Normal);
Sensor gyroscope = sensorManager.GetDefaultSensor(SensorType.Gyroscope);
sensorManager.RegisterListener(this, gyroscope, SensorDelay.Normal);
Sensor magnetometer = sensorManager.GetDefaultSensor(SensorType.MagneticField);
sensorManager.RegisterListener(this, magnetometer, SensorDelay.Normal);
//sensor fusion
//linear acceleration
Sensor linearAcceleration = sensorManager.GetDefaultSensor(SensorType.LinearAcceleration);
sensorManager.RegisterListener(this, linearAcceleration, SensorDelay.Normal);
//gravity
Sensor gravity = sensorManager.GetDefaultSensor(SensorType.Gravity);
sensorManager.RegisterListener(this, gravity, SensorDelay.Normal);
//pitch yaw roll / orientation
Sensor orientation = sensorManager.GetDefaultSensor(SensorType.Orientation);
sensorManager.RegisterListener(this, orientation, SensorDelay.Normal);
//quaternion
Sensor rotationVector = sensorManager.GetDefaultSensor(SensorType.RotationVector);
sensorManager.RegisterListener(this, rotationVector, SensorDelay.Normal);
}
}
}
提前致谢;)
答案 0 :(得分:0)
经过12个多小时的调试,我已经解决了这个问题! 我已将服务从intentservice更改为普通服务。 感知的其余部分是在第二次服务中获得的。 似乎像这样的代码块是一个瓶颈:
_magnetometerRepository.Add(new Magnetometer()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
这是我的最终结果:
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Hardware;
using Tabi.DataStorage;
using Tabi.DataObjects;
using System.Threading.Tasks;
namespace Tabi.Droid.CollectionService
{
[Service]
public class SensorService : Service, ISensorEventListener
{
private readonly ISensorRepository<Accelerometer> _accelerometerRepository;
private readonly ISensorRepository<Gyroscope> _gyroscopeRepository;
private readonly ISensorRepository<Magnetometer> _magnetometerRepository;
private SensorServiceBinder _binder;
public SensorService()
{
_accelerometerRepository = App.RepoManager.AccelerometerRepository;
_gyroscopeRepository = App.RepoManager.GyroscopeRepository;
_magnetometerRepository = App.RepoManager.MagnetometerRepository;
}
public override IBinder OnBind(Intent intent)
{
// service binder is used to communicate with the service
_binder = new SensorServiceBinder(this);
return _binder;
}
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
//!!!possibly needed for android 8+
// maybe convert it into foreground service and uncomment code below
//Notification.Builder builder = new Notification.Builder(Application.Context, "com.tabi.sensor");
//builder.SetContentTitle("sensor");
//builder.SetContentText("you are being watched -.-");
//builder.SetAutoCancel(true);
//Notification notification = builder.Build();
//StartForeground(1, notification);
//register sensors for listening
Task.Run(() =>
{
var sensorManager = (SensorManager)Application.Context.GetSystemService(Context.SensorService);
Sensor accelerometer = sensorManager.GetDefaultSensor(SensorType.Accelerometer);
sensorManager.RegisterListener(this, accelerometer, SensorDelay.Normal);
Sensor gyroscope = sensorManager.GetDefaultSensor(SensorType.Gyroscope);
sensorManager.RegisterListener(this, gyroscope, SensorDelay.Normal);
Sensor magnetometer = sensorManager.GetDefaultSensor(SensorType.MagneticField);
sensorManager.RegisterListener(this, magnetometer, SensorDelay.Normal);
});
return StartCommandResult.Sticky;
}
public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
{
}
public void OnSensorChanged(SensorEvent e)
{
//start gathering data and push to SqliteDB
switch (e.Sensor.Type)
{
case SensorType.Accelerometer:
Task.Run(() =>
{
_accelerometerRepository.Add(new Accelerometer()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
Console.WriteLine("accelerometer: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
});
break;
case SensorType.Gyroscope:
Task.Run(() =>
{
_gyroscopeRepository.Add(new Gyroscope()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
});
Console.WriteLine("Gyroscope: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
break;
case SensorType.MagneticField:
Task.Run(() =>
{
_magnetometerRepository.Add(new Magnetometer()
{
Timestamp = DateTimeOffset.Now,
X = e.Values[0],
Y = e.Values[1],
Z = e.Values[2],
});
});
Console.WriteLine("magnetometer: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
break;
default:
break;
}
}
}
}
感谢SushiHangover为我提供线程化的想法!