⑴ 怎么检测手机屏幕触摸的灵敏度啊
检测手机屏幕触摸灵敏度的方法:
1、打开手机的设置,点击“通用”,如图:
(1)androidpitch扩展阅读:
手机屏幕,是用于显示图像及色彩。荧幕尺寸依荧幕对角线计算,通常以英寸(inch)作单位,指荧幕对角的长度。屏幕材质引随着手机彩屏的逐渐普遍,手机屏幕的材质也越来越显得重要。
手机的彩色屏幕因为LCD品质和研发技术不同而有所差异,其种类大致有TFT 、TFD、UFB、STN和OLED几种。一般来说能显示的颜色越多越能显示复杂的图象,画面的层次也更丰富。
网络-手机屏幕
⑵ 安卓系统里的“hw.pcm”"ns.pcm""pitchPcm.pcm" 等到底是什么文件来的
肯定是临时文件,我手机里面是rec之类的大汶件。删除没事。但哪个软件这样看不出来。
⑶ android如何实现陀螺仪 sensor 在 android 吗
设备中的三自由度Orientation
Sensor就是一个可以识别设备相对于地面,绕x、y、z轴转动角度的感应器(自己的理解,不够严谨)。智能手机,平板电脑有了它,可以实现很多好玩的应用,比如说指南针等。
我们可以用一个磁场感应器(magnetic sensor)来实现。
磁场感应器是用来测量磁场感应强度的。一个3轴的磁sensor
IC可以得到当前环境下X、Y和Z方向上的磁场感应强度,对于Android中间层来说就是读取该感应器测量到的这3个值。当需要时,上报给上层应用程序。磁感应强度的单位是T(特斯拉)或者是Gs(高斯),1T等于10000Gs。
先来看看android定义的坐标系,在/hardware/libhardware/include/hardware/sensors.h中有个图。
求z和x的反正切可得到此值。
sensors.h中还定义了其他各种sensor。要实现的就是这两个:
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3
在/hardware/sensors/sensors.cpp 中添加对MAGNETIC_FIELD和ORIENTATION 的支持
⑷ android怎么为什么必须在亮屏时写tp节点
No.1
现象描述:进入浏览器,网页放大和缩小效果差
原因分析:由于TP抖动导致该问题。
解决方法:有抖动导致放大缩小不稳定,需要开启防抖功能,在最后主动丢掉2~3个点。
开启防抖会降低报点率,需要结合用户效果体验测试来决定防抖功能舍弃几个点。
No.2
现象描述:TP下边缘划线测试80%几率出现断线
原因分析:由于LCD显示区域和TP贴合的问题引起的。
解决方法:如果按键区与AA区是连成一块报坐标的,所以下边沿很容易划到AA区以外的值,该值在LCD是显示不出来
的,所以就类似断线。目前修改的方法为:在驱动中,对Y轴下边大于Y_MAX且小于Key_Y值时,则统一上
报为Y_MAX。
No.3
现象描述:三个点同时接触TP,TP失效没有反应
原因分析:TP IC本身算法问题。当限定为最大允许2指时,在有第3指时将不会上报。
解决方法:有些IC算法对于最大上报点数进行上报抑制,目前的智能机一般最多支持两点,
检测到多于2个点时,只上报前2个点:即上报ID=1和ID=2的两个点。
No.4
现象描述:3个手指同时点击TP,手指间连成一条线段
原因分析:TP ID上报导致的问题
解决方法:多指同时触摸时容易导致ID切换,从而手指间由于ID匹配错误造成连成一条线段。
No.5
现象描述:手指点击TP上的功能图标,概率性不能进入该图标功能而是引起翻动界面现象
原因分析:在点击操作时,如果TP非常灵敏,单点也会出现一条线,被认为是翻页操作。
解决方法:TP抖动导致单击会连线,可以通过增加filter坐标窗口来对抖动进行抑制。
filter为坐标过滤窗口,即坐标的移动要大于这个值才会真正上报,即开启防抖功能。
No.6
现象描述:进入Development.apk,划出的线扭曲不平滑
解决方法:画线平滑度是通过调整TP配置参数的差值一致性来调整的,与TP结构阻抗等有关
No.7
现象描述:悬空用电容笔做TP划线测试1分钟,断线超过10次
原因分析:由于悬空导致电荷差值变化减小,算法中不认为是TOUCH事件,导致断线问题
解决方法:悬空容易误判断到松键导致断线,通过提高触摸灵敏度,主要为降低松键阈值,
使悬浮状态时不容易松键,从而解决断线问题。
No.8
现象描述:悬空时,TP上一手指固定,另一手指划过其X值或Y值位置易引发误触和断线
原因分析:悬空导致的问题
解决方法:悬浮时双指并行容易差值起不来,因此通过减小松键阈值使其不容易松键,来解决误触和断线的问题
No.9
现象描述:悬空多点点击TP,出现误触
原因分析:悬空导致的问题。
解决方法:触摸响应灵敏度过高导致,通过提高按键的阈值,使IC不会误检测到有按键。
No.10
现象描述:连接USB时TP定位不准确,点击第二排,却响应第三排
原因分析:充电共模干扰问题。
解决方法:在通过调整共模干扰参数无法解决的情况下,可以通过下发两种配置参数的机制来解决该问题。即:在通
常使用条件下,使用一组参数;在检测到充电状态时,下发另一组充电状态下使用的配置参数来规避。
No.11
现象描述:测试机放置在桌上,接标配BYD_TC-G60充电器,大拇指接触TP有明显误触
原因分析:共模干扰和大面积拆合点问题导致
解决方法:大面积TOUCH时,会出现拆点和合点的问题,会在拆点和合点之间来回切换,
通过调高识别为TOUCH事件点数的阀值来规避该问题。
No.12
现象描述:充电时慢速划线,划出的线非常扭曲
原因分析:充电共模干扰问题。
解决方法:共模干扰导致,提高驱动频率可以解决该问题。因为充电器在不同的频段干扰信号的强度会不一样,只要
低于3mv的干扰就基本不会对TP产生影响,通过充电器的共模分析,0X70即724Khz可以满足该该要求。
No.13
现象描述:测试机在手上或桌上,安装Development.apk,大拇指划线测试出现不同程度断线
原因分析:大面积拆合点问题导致
解决方法:悬浮大面积触摸导致拆点不稳定,从而产生断线,跟TP结构和整机结构有很大关系,
通过调高识别为TOUCH事件点数的阀值来规避该问题。
No.14
现象描述:桌上或手持测试机,大拇指接触TP报两点
原因分析:大面积及拆点算法问题。
解决方法:解决方法问题同13
No.15
现象描述:左半屏报点偏左上,右半屏报点偏右上
原因分析:TP IC算法问题,由于边缘拉伸导致。
解决方法:由于TP边缘只有半个PITCH的通道,导致触摸TP时发生向内偏移的问题。IC为了解决该问题做了边缘拉伸算
法,对边沿专门做了边沿拉伸处理,所以会微偏,不会影响使用且能画到边。但可以通过边沿回缩方式对
边沿进行回拉,唯一响应点就是会稍微摸不到边。
No.16
现象描述:蘸少量水画线,出现线条凌乱现象
原因分析:TP表面有水后,导致TP基准发生变化,导致画线凌乱问题
解决方法:这个跟TP的表面材质的亲水性有很大关系,目前只能通过调高灵敏度来规避,
由于基准值发生变化,只能采取规避措施
以上就介绍了Android 触摸屏(TP)问题现象分析和解决方法汇总,包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。
⑸ 安卓手机怎么校准屏幕
1、我们打开安卓手机,点开设置选项,如下图所示。
⑹ android如何实现陀螺仪 sensor 在 android 吗
千锋扣丁学堂Android开发为您解答:
sensors.h中还定义了其他各种sensor。要实现的就是这两个:
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3
在/hardware/sensors/sensors.cpp 中添加对MAGNETIC_FIELD和ORIENTATION 的支持
[cpp] view plain
//加入需要的宏定义
#define ID_BASE SENSORS_HANDLE_BASE
#define ID_ACCELERATION (ID_BASE+0)
#define ID_MAGNETIC_FIELD (ID_BASE+1)
#define ID_ORIENTATION (ID_BASE+2)
#define S_HANDLE_ACCELEROMETER (1<<ID_ACCELERATION)
#define S_HANDLE_MAGNETIC_FIELD (1<<ID_MAGNETIC_FIELD)
#define S_HANDLE_ORIENTATION (1<<ID_ORIENTATION)
#define SENSORS_NUM 4
#define SUPPORTED_SENSORS ((1<<NUM_SENSORS)-1)
//在 sensor_t sensors_list[] 中添加两个sensor的信息,
//这些只是一些Sensor的信息,应用程序可以获取到。
#ifdef MAGNETIC_FIELD
{
name : "XXX 3-axis Magnetic field sensor",
vendor : "XXX company",
version : 1,
handle : S_HANDLE_MAGNETIC_FIELD,
type : SENSOR_TYPE_MAGNETIC_FIELD,
maxRange : 600.0f,//最大范围
resolution : 30.0f,//最小分辨率
power : 6.7f,//这个不太懂
},
#endif
#ifdef ORIENTATION
{
name: "XXX Orientation sensor",
vendor: "XXX company",
version: 1,
handle: S_HANDLE_ORIENTATION,
type: SENSOR_TYPE_ORIENTATION,
maxRange: 360,
resolution: 0.1,
power: 20,
},
#endif
//定义一个结构来保存orientation的信息
static struct orientation{
float azimuth;
float pitch;
float roll;
}orientation;
//在 control__open_data_source()函数中打开设备
static native_handle_t*
control__open_data_source(struct sensors_control_device_t *dev)
{
SensorControl* ctl = (void*)dev;
native_handle_t* handle;
int fd_m = open (MAGNETIC_DATA_DEVICE, O_RDONLY);
LOGD ("Open Magnetic Data source: %d, %d/n", fd_m, errno);
if (fd_m>= 0)
{
dev->fd[ID_MAGNETIC_FIELD] = p(fd_m);
}
return handle;
}
//实现数据的打开和关闭函数
static int
data__data_open(struct sensors_data_device_t *dev, native_handle_t* handle)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;
for(int i=0 ;i<SENSORS_NUM; i++)
{
dev->fd[i] = p(handle->data[i]);
}
native_handle_close(handle);
native_handle_delete(handle);
return 0;
}
static int
data__data_close(struct sensors_data_device_t *dev)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;
for(int i=0 ;i<SENSORS_NUM; i++)
{
if (dev->fd[i] >= 0)
{
close(dev->fd[i]);
}
dev->fd[i] = -1;
}
return 0;
}
//最关键的poll函数
static int
data__poll(struct sensors_data_device_t *dev, sensors_data_t* values)
{
SensorData* data = (void*)dev;
int fd = data->events_fd;
//判断设备是否打开
if(dev->fd[ID_MAGNETIC_FIELD] < 0)
{
LOGD("In %s dev[%d] is not open!/n",__FUNCTION__ ,ID_MAGNETIC_FIELD);
return -1;
}
pollfd pfd[SENSORS_NUM] =
{
//省略其他sensor代码
{
fd: dev->fd[ID_MAGNETIC_FIELD],
events: POLLIN,
revents: 0
},
//省略其他sensor代码
};
int err = poll (pfd, SENSORS_NUM, s_timeout);
unsigned int mask = SUPPORTED_SENSORS;
static unsigned int poll_flag=0;
if(poll_flag==0)
{
poll_flag = mask;
}
//省略其他sensor
if(poll_flag&(1<<ID_MAGNETIC_FIELD))
{
if((pfd[ID_MAGNETIC_FIELD].revents&POLLIN) == POLLIN)
{
char rawData[6];
err = read (dev->fd[ID_MAGNETIC_FIELD], &rawData, sizeof(rawData));
if(err<0)
{
LOGE("read magnetic field ret:%d errno:%d/n", err, errno);
return err;
}
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_MAGNETIC_FIELD;
data->magnetic.status = SENSOR_STATUS_ACCURACY_HIGH;
//上报的数据单位要转换成 uTesla
data->magnetic.x = ( (rawData[1] << 8 ) | rawData[0])/ MAGNETIC_CONVERT;
data->magnetic.y = ( (rawData[3] << 8 ) | rawData[2])/ MAGNETIC_CONVERT;
data->magnetic.z = ( (rawData[5] << 8 ) | rawData[4])/ MAGNETIC_CONVERT;
//把陀螺仪需要的数据计算出来,用atan2(),头文件要加上#include <math.h>
float azimuth = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.y) );
if(azimuth<0)
{
azimuth = 360 - fabs(azimuth*180/PI);
}
else
{
azimuth = azimuth*180/PI;
}
orientation.azimuth = 360-azimuth;
//rotation around the X axis.+180~-180 degree
orientation.pitch = atan2( (float)(data->magnetic.y ),(float)(data->magnetic.z)
)*180/PI;
//rotation around the Y axis +90~-90 degree
float roll = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.z) )
*180/PI;
if (roll > 90)
{
roll = -(180.0-roll);
}
else if (roll < -90)
{
roll = 180 + roll;
}
orientation.roll = roll;
}
return S_HANDLE_MAGNETIC_FIELD;
}
if(poll_flag&(1<<ID_MAGNETIC_FIELD))
{
//数据已经计算好了直接上报就行
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_ORIENTATION;
data->orientation.azimuth = orientation.azimuth;
data->orientation.pitch = orientation.pitch;
data->orientation.roll = orientation.roll;
poll_flag &= ~(1<<ID_ORIENTATION);
return S_HANDLE_ORIENTATION;
}
}
⑺ 如何在Android用FFmpeg解码图像
创建一个VideoPicture结构体用来保存解码出来的图像。
LOCAL_PATH := $(call my-dir)
###########################
#
# SDL shared library
#
###########################
include $(CLEAR_VARS)
LOCAL_MODULE := SDL2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/mmy/*.c) \
$(LOCAL_PATH)/src/atomic/SDL_atomic.c \
$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \
$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \
$(wildcard $(LOCAL_PATH)/src/events/*.c) \
$(wildcard $(LOCAL_PATH)/src/file/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/mmy/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \
$(wildcard $(LOCAL_PATH)/src/power/*.c) \
$(wildcard $(LOCAL_PATH)/src/power/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/filesystem/mmy/*.c) \
$(wildcard $(LOCAL_PATH)/src/render/*.c) \
$(wildcard $(LOCAL_PATH)/src/render/*/*.c) \
$(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/test/*.c))
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
include $(BUILD_SHARED_LIBRARY)
###########################
#
# SDL static library
#
###########################
#LOCAL_MODULE := SDL2_static
#LOCAL_MODULE_FILENAME := libSDL2
#LOCAL_SRC_FILES += $(LOCAL_PATH)/src/main/android/SDL_android_main.c
#LOCAL_LDLIBS :=
#LOCAL_EXPORT_LDLIBS := -Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
#include $(BUILD_STATIC_LIBRARY)
二、参考[原]如何在Android用FFmpeg解码图像, 在工程中新建一个ffmpeg文件夹,将与ffmpeg相关的头文件include进来。ffmpeg文件夹下的Android.mk内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := /path/to/build/ffmpeg/libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)
三、新建player文件夹,用来编写解码与显示文件。player.c文件内容:
/*
* SDL_Lesson.c
*
* Created on: Aug 12, 2014
* Author: clarck
*/
#include <jni.h>
#include <android/native_window_jni.h>
#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_events.h"
#include "../include/logger.h"
#include "../ffmpeg/include/libavcodec/avcodec.h"
#include "../ffmpeg/include/libavformat/avformat.h"
#include "../ffmpeg/include/libavutil/pixfmt.h"
#include "../ffmpeg/include/libswscale/swscale.h"
int main(int argc, char *argv[]) {
char *file_path = argv[1];
LOGI("file_path:%s", file_path);
AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrame, *pFrameYUV;
AVPacket *packet;
uint8_t *out_buffer;
SDL_Texture *bmp = NULL;
SDL_Window *screen = NULL;
SDL_Rect rect;
SDL_Event event;
static struct SwsContext *img_convert_ctx;
int videoStream, i, numBytes;
int ret, got_picture;
av_register_all();
pFormatCtx = avformat_alloc_context();
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
LOGE("Could not initialize SDL - %s. \n", SDL_GetError());
exit(1);
}
if (avformat_open_input(&pFormatCtx, file_path, NULL, NULL) != 0) {
LOGE("can't open the file. \n");
return -1;
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
LOGE("Could't find stream infomation.\n");
return -1;
}
videoStream = 1;
for (i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStream = i;
}
}
LOGI("videoStream:%d", videoStream);
if (videoStream == -1) {
LOGE("Didn't find a video stream.\n");
return -1;
}
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (pCodec == NULL) {
LOGE("Codec not found.\n");
return -1;
}
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
LOGE("Could not open codec.\n");
return -1;
}
pFrame = av_frame_alloc();
pFrameYUV = av_frame_alloc();
//---------------------------init sdl---------------------------//
screen = SDL_CreateWindow("My Player Window", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, pCodecCtx->width, pCodecCtx->height,
SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL);
SDL_Renderer *renderer = SDL_CreateRenderer(screen, -1, 0);
bmp = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_YV12,
SDL_TEXTUREACCESS_STREAMING, pCodecCtx->width, pCodecCtx->height);
//-------------------------------------------------------------//
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
numBytes = avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width,
pCodecCtx->height);
out_buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
avpicture_fill((AVPicture *) pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P,
pCodecCtx->width, pCodecCtx->height);
rect.x = 0;
rect.y = 0;
rect.w = pCodecCtx->width;
rect.h = pCodecCtx->height;
int y_size = pCodecCtx->width * pCodecCtx->height;
packet = (AVPacket *) malloc(sizeof(AVPacket));
av_new_packet(packet, y_size);
av_mp_format(pFormatCtx, 0, file_path, 0);
while (av_read_frame(pFormatCtx, packet) >= 0) {
if (packet->stream_index == videoStream) {
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,
packet);
if (ret < 0) {
LOGE("decode error.\n");
return -1;
}
LOGI("got_picture:%d", got_picture);
if (got_picture) {
sws_scale(img_convert_ctx,
(uint8_t const * const *) pFrame->data,
pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data,
pFrameYUV->linesize);
////iPitch 计算yuv一行数据占的字节数
SDL_UpdateTexture(bmp, &rect, pFrameYUV->data[0], pFrameYUV->linesize[0]);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, bmp, &rect, &rect);
SDL_RenderPresent(renderer);
}
SDL_Delay(50);
}
av_free_packet(packet);
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
SDL_Quit();
exit(0);
break;
default:
break;
}
⑻ Android 中有哪些传感器的数据是可以分享的
目前 Android 设备支持的传感器类型如下:
TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor,该数值包含地心引力的影响,单位是 m/s2,测量应用于设备 x 、y、z 轴上的加速度。
将手机平放在桌面上,x 轴默认为0,y 轴默认0,z 轴默认9.81。
将手机朝下放在桌面上,z 轴为-9.81。
将手机向左倾斜,x 轴为正值。
将手机向右倾斜,x 轴为负值。
将手机向上倾斜,y 轴为负值。
将手机向下倾斜,y 轴为正值。
TYPE_AMBIENT_TEMPERATURE 温度传感器,单位是 ℃,返回当前的温度。
TYPE_GAME_ROTATION_VECTOR 用来探测运动而不必受到电磁干扰的影响,因为它并不依赖于磁北极。
TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋转矢量传感器,提供手机的旋转矢量,当手机处于休眠状态时,仍可以记录设备的方位。
TYPE_GRAVITY 重力传感器简称 GV-sensor,单位是 $m/s^2%,测量应用于设备X、Y、Z轴上的重力。在地球上,重力数值为9.8,
TYPE_GYROSCOPE 陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角加速度数据。单位是 radians/second。
TYPE_GYROSCOPE_UNCALIBRATED 未校准陀螺仪传感器,提供原始的、未校准、补偿的陀螺仪数据,用于后期处理和融合定位数据。
TYPE_LIGHT 光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。
TYPE_LINEAR_ACCELERATION 线性加速度传感器简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是 m/s2。
TYPE_MAGNETIC_FIELD 磁力传感器简称为M-sensor,返回 x、y、z 三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss。硬件上一般没有独立的磁力传感器,磁力数据由电子罗盘传感器提供(E-compass)。电子罗盘传感器同时提供方向传感器数据。
TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校准磁力传感器,提供原始的、未校准的磁场数据。
TYPE_ORIENTATION 方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。为了得到精确的角度数据,E-compass 需要获取 G-sensor 的数据,经过计算生产 O-sensor 数据,否则只能获取水平方向的角度。方向传感器提供三个数据,分别为azimuth、pitch和roll:
azimuth: 方位,返回水平时磁北极和 Y 轴的夹角,范围为0°至360°。0°为北,90°为东,180°为南,270°为西。
pitch: x 轴和水平面的夹角,范围为-180°至180°。当 z 轴向 y 轴转动时,角度为正值。
roll: y 轴和水平面的夹角,由于历史原因,范围为-90°至90°。当 x 轴向 z 轴移动时,角度为正值。
TYPE_PRESSURE 压力传感器,单位是hPa(百帕斯卡),返回当前环境下的压强。
TYPE_PROXIMITY 接近传感器检测物体与手机的距离,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态。
TYPE_RELATIVE_HUMIDITY 湿度传感器,单位是 %,来测量周围环境的相对湿度。
TYPE_ROTATION_VECTOR 旋转矢量传感器简称RV-sensor。旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。RV-sensor输出三个数据:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是 RV 的数量级。RV 的方向与轴旋转的方向相同。RV 的三个数值,与cos(theta/2)组成一个四元组。
TYPE_SIGNIFICANT_MOTION 特殊动作触发传感器。
TYPE_STEP_COUNTER 计步传感器,用于记录激活后的步伐数。
TYPE_STEP_DETECTOR 步行检测传感器,用户每走一步就触发一次事件。
TYPE_TEMPERATURE 温度传感器,目前已被TYPE_AMBIENT_TEMPERATURE替代。