Android 在服务启动几秒钟后获取WaitingMain信号捕捉器Loop信号捕捉器
我正在创建一个Xamarin应用程序,它收集传感器数据,以便我可以使用机器学习进行实验。应用程序正在后台使用intentservice。。但几秒钟后,我得到以下错误: 03-23 21:31:14.772 I/zygote64(18051):线程[3,tid=18057,WaitingMain信号捕捉器Loop,线程*=0x7DABC0400,对等方=0x13fc0088,“信号捕捉器”]:对信号3作出反应 03-23 21:31:14.772 I/合子64(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#在#pid=18051之后 03-23 21:31:14.883 I/zygote64(18051):将堆栈跟踪写入“/data/anr/traces.txt” 我正在用android 8.0.0在Oneplus 3T上调试。 传感器数据通过sqlite网络ORM直接写入sqlite数据库 我已经试着调试了9个小时了。。但是我不能纠正这个错误。 当我评论这项服务时。。它没有给我任何错误 我的服务就是这样的:Android 在服务启动几秒钟后获取WaitingMain信号捕捉器Loop信号捕捉器,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,我正在创建一个Xamarin应用程序,它收集传感器数据,以便我可以使用机器学习进行实验。应用程序正在后台使用intentservice。。但几秒钟后,我得到以下错误: 03-23 21:31:14.772 I/zygote64(18051):线程[3,tid=18057,WaitingMain信号捕捉器Loop,线程*=0x7DABC0400,对等方=0x13fc0088,“信号捕捉器”]:对信号3作出反应 03-23 21:31:14.772 I/合子64(18051): 03-23 21:3
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);
}
}
}
使用系统;
使用Android.App;
使用Android.Content;
使用Android.OS;
使用Android.Runtime;
使用Android.Hardware;
使用Tabi.DataStorage;
使用Tabi.DataObjects;
命名空间Tabi.Droid.CollectionService
{
[服务]
公共类SensorService:IntentService、IsSensorEventListener
{
专用只读ISensorRepository\u accelerometerRepository;
专用只读ISensorRepository\u存储库;
专用只读ISensorRepository\u磁强计存储库;
专用只读ISensorRepository\u linearAccelerationRepository;
专用只读ISensorRepository\u orientationRepository;
专用只读ISensorRepository_四元数存储库;
专用只读ISensorRepository\u gravityRepository;
公共服务()
{
_accelerometerRepository=App.RepoManager.accelerometerRepository;
_陀螺仪存储库=App.RepoManager.repository;
_magnetometerRepository=App.RepoManager.magnetometerRepository;
_linearacelerationrepository=App.RepoManager.linearacelerationrepository;
_orientationRepository=App.RepoManager.orientationRepository;
_四元数存储库=App.RepoManager.quaternionRepository;
_gravityRepository=App.RepoManager.gravityRepository;
}
精度更改的公共无效(传感器、[GenerateNum]传感器状态精度)
{
}
传感器更改时的公共无效(传感器事件e)
{
//开始收集数据并推送到SqliteDB
开关(例如传感器类型)
{
外壳传感器类型。加速计:
_accelerometerRepository.Add(新加速计()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2],
});
打破
外壳传感器类型。陀螺仪:
_陀螺仪存储库。添加(新陀螺仪()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2],
});
打破
外壳传感器类型。磁场:
_磁强计还原。添加(新磁强计()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2],
});
打破
外壳传感器类型。方向:
_添加(新方向()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2]
});
打破
外壳传感器类型。重力:
_gravityRepository.Add(新重力()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2]
});
打破
外壳传感器类型.线性加速:
_添加(新的LinearAcceleration()
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2]
});
打破
外壳传感器类型.旋转矢量:
_添加(新的四元数)
{
时间戳=日期时间偏移。现在,
X=e.值[0],
Y=e.值[1],
Z=e.值[2],
W=e.数值[3]
});
打破
违约:
打破
}
}
受保护的覆盖无效OnHandleIntent(意图)
{
var sensorManager=(sensorManager)Application.Context.GetSystemService(Context.SensorService);
传感器加速计=sensorManager.GetDefaultSensor(传感器类型.加速计);
sensorManager.RegisterListener(此、加速计、传感器延迟。正常);
传感器陀螺仪=sensorManager.GetDefaultSensor(传感器类型.陀螺仪);
sensorManager.RegisterListener(这是陀螺仪,传感器延迟,正常);
传感器磁强计=传感器管理器.Ge
_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;
}
}
}
}