前言:
安卓Sensor数据的获取除了java上层开发外,还有native本地开发。比如基于Sensor数据的算法,为了保证效率,肯定是在native层运行。本文主要基于Android Native 获取不同的Sensor(陀螺仪/加速度/重力/角速度/磁力)数据及工程示例代码。
核心接口:
//获取AsensorManager对象
ASensorManager pSM= ASensorManager_getInstanceForPackage("");
//设置加速度的值
ASensor accelerometer = ASensorManager_getDefaultSensor(pSM, ASENSOR_TYPE_ACCELEROMETER);
//获取Alooper对象
ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
// 获取AsensorEventQueue对象
ASensorEventQueue* m_pEvtQue= ASensorManager_createEventQueue(pSM, looper,
LOOPER_ID_USER, NULL, NULL);
// 使能sensor
ASensorEventQueue_enableSensor(m_pEvtQue, accelerometer);
//设置sensor的频率, SENSOR_REFRESH_PERIOD_US为 int值,单位为us。
status = ASensorEventQueue_setEventRate(m_pEvtQue, accelerometer,SENSOR_REFRESH_PERIOD_US);
获取数据代码:
示例代码会把获取到的sensor数据全部打印出来
int64_t stamp;
while (m_bListening)
{
ASensorEvent event;
while (ASensorEventQueue_getEvents(m_pEvtQue, &event, 1) > 0)
{
stamp = event.timestamp;
switch (event.type)
{
case ASENSOR_TYPE_GYROSCOPE: //陀螺仪传感器
printf("GYROSCOPE:(%llu, %f,%f,%f)\n", (unsigned long long)stamp, event.data[0], event.data[1], event.data[2]);
break;
case ASENSOR_TYPE_ACCELEROMETER:// 加速度传感器
printf("ACCELEROMETER: (%llu, %f,%f,%f)\n", (unsigned long long)stamp, event.data[0], event.data[1], event.data[2]);
break;
case ASENSOR_TYPE_MAGNETIC_FIELD:// 磁力传感器
printf("MAGNETIC: (%llu, %f,%f,%f)\n", (unsigned long long)stamp, event.data[0], event.data[1], event.data[2]);
break;
case ASENSOR_TYPE_ROTATION_VECTOR:// 角速度传感器
printf("ROTATION: (%llu, %f,%f,%f %f)\n", (unsigned long long)stamp, event.data[0], event.data[1], event.data[2],event.data[3]);
break;
case ASENSOR_TYPE_GRAVITY:// 重力传感器
printf("GRAVITY: (%llu, %f,%f,%f)\n", (unsigned long long)stamp, event.data[0], event.data[1], event.data[2]);
break;
default:
break;
}
}
usleep(1000);
}
示例:
如果不想浪费时间重复的造轮子,可以直接使用我的实例代码工程,代码里有获取陀螺仪/加速度/重力/角速度/磁力示例。代码很简洁,可以直接运用于实际代码工程。
文件结构:
调用方法:
编译运行:
把示例文件夹拷贝到Android源码根目录,
1. source build/envsetup.sh
2. lunch xxx
3. 示例代码目录下执行 mm -j32
最后会生成:out/target/product/kona/system/bin/sensorAndroid可执行文件
adb push到开发板。
最后运行效果: