当前位置:首页 » 安卓系统 » sensorsandroid

sensorsandroid

发布时间: 2023-10-16 18:03:00

㈠ 开发android应用程序怎么调用光传感器

Android手机自带光线传感器,通常我们手机的屏幕自动亮度都是用光线传感器来实现的。该传感器在前置摄像头附近,此外,还有一个距离传感器。本文主要讲解如何使用Android手机的光线传感器。

获得感应器服务

Android开发中要使用光线传感器,需要先获得系统传感器服务Context.SENSOR_SERVICE,获得方法如下:

SensorManager senserManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

获得光线传感器

SensorManager是系统传感器服务,是系统所有传感器的管理器。通过它,我们获得制定类型的传感器,获得光线传感器的方法如下:

详细代码

㈡ android手机都有哪些sensor

1.Sensor Type
重力感应/加速度传感器 (G-Sensor)
光感应 (Light-Sensor)
温度感应
方向感应
磁场、
临近性

2.如何实现Sensor编程
a.获取系统服务(SENSOR_SERVICE)返回一个SensorManager 对象
sensormanager = (SensorManager)getSystemSeriver(SENSOR_SERVICE);
b.通过SensorManager对象获取相应的Sensor类型的对象
sensorObject = sensormanager.getDefaultSensor(sensor Type);
c.声明一个SensorEventListener 对象用于侦听Sensor 事件,并重载onSensorChanged方法
SensorEventListener sensorListener = new SensorEventListener(){
};
d.注册相应的SensorService
sensormanager.registerListener(sensorListener, sensorObject, Sensor TYPE);
e.销毁相应的SensorService
sensormanager.unregisterListener(sensorListener, sensorObject);

f: SensorListener 接口是传感器应用程序的中心。它包括两个必需方法:
onSensorChanged(int sensor,float values[]) 方法在传感器值更改时调用。
该方法只对受此应用程序监视的传感器调用(更多内容见下文)。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。
当传感器的准确性更改时,将调用 onAccuracyChanged(int sensor,int accuracy) 方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。

3.关于G-Sensor
Android 加速度传感器的类型是 Sensor.TYPE_ACCELEROMETER
通过 android.hardware.SensorEvent 返回加速度传感器值。
加速度传感器返回值的单位是加速度的单位 m/s^2(米每二次方秒),有三个方向的值分别是
values[0]: x-axis 方向加速度
values[1]: y-axis 方向加速度
values[2]: z-axis 方向加速度
其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点
x 方向就是手机的水平方向,右为正
y 方向就是手机的水平垂直方向,前为正
y 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负
需要注意的是,由于地球固有的重力加速度g (值为9.8 m/s^2),
因此现实中实际加速度值应该是 z方向返回值 - 9.8 m/s^2.
比如你以 2 m/s^2 的加速度将手机抛起,这时z方向的返回值应该是 11.8 m/s^2.
反之若以手机以2 m/s^2 的加速度坠落,则z方向的返回值应该是 7.8 m/s^2.
x,y方向则没有上述限制。

㈢ android 判断支持哪些传感器

Android中判断手机是否支持传感器,可以通过SensorManager这个类来获取手机所有的传感器列表,如下代码:

package com.example.testsensor;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class DemoSensorActivity extends Activity {
private Button button;
private TextView show;
private SensorManager sm;
private StringBuffer str;
private List<Sensor> allSensors;
private Sensor s;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.button);
show = (TextView) findViewById(R.id.show);
button.setOnClickListener(new ButtonListener());
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
allSensors = sm.getSensorList(Sensor.TYPE_ALL);// 获得传感器列表
}
class ButtonListener implements OnClickListener {
public void onClick(View v) {
str = new StringBuffer();
str.append("该手机有" + allSensors.size() + "个传感器,分别是:\n");
for (int i = 0; i < allSensors.size(); i++) {
s = allSensors.get(i);
switch (s.getType()) {
case Sensor.TYPE_ACCELEROMETER:
str.append(i + "加速度传感器");
break;
case Sensor.TYPE_GYROSCOPE:
str.append(i + "陀螺仪传感器");
break;
case Sensor.TYPE_LIGHT:
str.append(i + "环境光线传感器");
break;
case Sensor.TYPE_MAGNETIC_FIELD:
str.append(i + "电磁场传感器");
break;
case Sensor.TYPE_ORIENTATION:
str.append(i + "方向传感器");
break;
case Sensor.TYPE_PRESSURE:
str.append(i + "压力传感器");
break;
case Sensor.TYPE_PROXIMITY:
str.append(i + "距离传感器");
break;
case Sensor.TYPE_TEMPERATURE:
str.append(i + "温度传感器");
break;
default:
str.append(i + "未知传感器");
break;
}
}
show.setText(str);
}
}
}

㈣ 怎么把安卓系统中的重力传感器的数据读出来

有相应的编程接口。了解一下基本的安卓编程就知道了。
各种游戏 APP能使用重力数据 就是调取了相应的数据。
参考:
import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SensorGetValueActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager=(SensorManager)this.getSystemService(SENSOR_SERVICE);
setContentView(R.layout.main);
Button close=(Button)findViewById(R.id.btn_close);
close.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
protected void onResume(){
super.onResume();
List<Sensor> sensors=sensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor s:sensors){
sensorManager.registerListener(this, s,SensorManager.SENSOR_DELAY_NORMAL);
}
// sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
// SensorManager.SENSOR_DELAY_NORMAL);
}

public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
switch(event.sensor.getType()){
//加速度
case Sensor.TYPE_ACCELEROMETER:
TextView tv1=(TextView)findViewById(R.id.tv1);
String x1=String.valueOf(event.values[SensorManager.DATA_X]);
String y1=String.valueOf(event.values[SensorManager.DATA_Y]);
String z1=String.valueOf(event.values[SensorManager.DATA_Z]);
tv1.setText("加速度x:"+x1+"\n"+"加速度y:"+y1+"\n"+"加速度z:"+z1);
break;
//倾斜度
case Sensor.TYPE_ORIENTATION:
TextView tv2=(TextView)findViewById(R.id.tv2);
String x2=String.valueOf(event.values[SensorManager.DATA_X]);
String y2=String.valueOf(event.values[SensorManager.DATA_Y]);
String z2=String.valueOf(event.values[SensorManager.DATA_Z]);
tv2.setText("倾斜度x:"+x2+"\n"+"倾斜度y:"+y2+"\n"+"倾斜度z:"+z2);
break;
//磁力计
case Sensor.TYPE_MAGNETIC_FIELD:
TextView tv3=(TextView)findViewById(R.id.tv3);
String x3=String.valueOf(event.values[SensorManager.DATA_X]);
String y3=String.valueOf(event.values[SensorManager.DATA_Y]);
String z3=String.valueOf(event.values[SensorManager.DATA_Z]);
tv3.setText("磁力计x:"+x3+"\n"+"磁力计y:"+y3+"\n"+"磁力计z:"+z3);
break;
//温度
case Sensor.TYPE_TEMPERATURE:
TextView tv4=(TextView)findViewById(R.id.tv4);
String c=String.valueOf(event.values[SensorManager.DATA_X]);
tv4.setText("Degree:"+c);
break;
}
}
protected void onStop(){
super.onStop();
sensorManager.unregisterListener(this);
}
}

㈤ android sensor怎样注册input

Sensor作为Android系统的一个输入设备,对Android设备来说是必不可少的。Sensor主要包括G-Sensor、LightsSensor、ProximitySensor、TemperatureSensor等。这里主要对G-Sensor模块进行解析。

我的平台是AML8276,android系统是4.0.4,kernel是3.0,所用的gsensor是kionix_accel;
整个sensor的工作包括driver, HAL, framework(c/c++, java)和application层;
首先我们从驱动driver开始,然后一层层向上看;

一, 驱动层
在驱动层,内核需要增加和修改的部分包括:
1,相应硬件模块驱动代码,包括两个文件,这里是kionix_accel.h, kionix_accel.c,分别将kionix_accel.h放到kernel/common/customer/include/linux/中,将kionix_accel.c放到kernel/customer/drivers/misc/中;
2,编译目录(kernel/customer/drivers/misc/)下的Makefie 和KConfig,在KConfig中增加:
config SENSORS_KXTJ2
tristate "KXTJ2 accelerometer sensor driver"
depends on I2C
help

Say yes here to support Kionix's KXTJ2 accelerometer sensor
在MakeFile 下增加:obj-$(CONFIG_SENSORS_KXTJ2) += kionix_accel.o
3, 在平台编译配置文件中(也就是make menuconfig生成的),增加:CONFIG_SENSORS_KXTJ2=y------->指定编译到内核中,如果是m则编译成ko;

4,在平台模块代码文件中(kernel/customer/boards/board-m6g17-t069.c),在相应的i2c配置中,增加此模块:
static struct i2c_board_info __initdata aml_i2c_bus_info_b[] = {
........
#ifdef CONFIG_SENSORS_KXTJ2
{
I2C_BOARD_INFO("kionix_accel", KIONIX_ACCEL_I2C_ADDR),
//.irq = INT_GPIO_1,
.platform_data = (void *) &kionix_accel_pdata,
},
#endif
}
经过以上几步操作以后,就可以将此模块驱动编译到内核中。

G-sensor driver工作的大致流程:系统开机后,内核会先加载i2c总线驱动,然后再加载设备驱动,在设备驱动中的init函数中通过调用i2c_add_driver(&kionix_accel_driver)注册i2c_driver;此函数将driver注册到i2c_bus_type的总线上,此总线的匹配规则是利用i2c_client的名称和i2c_driver中id_table中的名称作匹配。其中i2c_client是系统自动创建的,board-m6g17-t069.c文件中的结构变量static struct i2c_board_info __initdata aml_i2c_bus_info_b中需要添加G-sensor的设备信息。
当匹配成功时,i2c_driver中的probe()函数开始执行。
mole_init(kionix_accel_init)---->i2c_add_driver(&kionix_accel_driver)----->static struct i2c_driver kionix_accel_driver = {
.driver = {
.name = KIONIX_ACCEL_NAME,
.owner = THIS_MODULE,
},
.probe = kionix_accel_probe,
.remove = __devexit_p(kionix_accel_remove),
.id_table = kionix_accel_id,
};
Probe()函数kionix_accel_probe()主要完成以下功能:
1.从i2c_client结构中得到初始化信息
2.创建G-sensor的工作队列
2.注册input_device设备
3.读取Chip ID
4.设置寄存器,使能G-sensor
5.设置并启动中断
当G-sensor上报数据的时候会触发中断,然后在中断处理函数中提交一个报值的任务到队列中并禁止中断。
在工作队列中读数G-sensor的数据并上报到input子系统中,最后使能中断。
系统启动后,驱动会在/sys/class/input/inputX下生成相应的设备文件,里面name节点包含有相应的模块名;
shell@
capabilities
device
event4
id
modalias
name
phys
power
properties
subsystem
uevent
uniq
同时会在/dev/input/里面也会生成inputX的节点,它是用来实际读取数据的。
驱动在工作的时候,主要分两部分:数据的采集及上报、设备的控制;
1,数据的采集主要是指通过I2C从硬件设备读取相关的数据并把数据上报,读取数据有两种方式,一种是通过中断,当有数据时,设备会发出中断信号给驱动,驱动去采集,另一种就是采用定时器不断的去定时采集数据;由于sensor也属于输入设备(还有TouchScreen,Keyboard,Mouse,Sensor等),所以上报的时候,也要报到linux kernel的输入子系统里面,上层通过相应的子系统设备节点读取数据。
上报数据的过程:static void report_abs(void)
{
short x,y,z,tilt;
if(read_data(&x,&y,&z,&tilt) != 0) {
/* report the absulate sensor data to input device */
input_report_abs(idev, ABS_X, y);
input_report_abs(idev, ABS_Y, x);
input_report_abs(idev, ABS_Z, z);
input_sync(idev);
}
2,设备的控制包括打开、关闭、设置参数和使能等,一般上层会通过ioctl方式来交互

附上出处链接:http://blog.csdn.net/yunjinwang/article/details/8461711

热点内容
phpmd5加密代码 发布:2024-11-30 12:29:35 浏览:899
苹果手机锁屏怎么取消密码 发布:2024-11-30 12:28:08 浏览:860
老娘也要当间谍ftp 发布:2024-11-30 12:23:17 浏览:131
家里如何安装文件服务器 发布:2024-11-30 12:15:35 浏览:352
淘宝抢货脚本js 发布:2024-11-30 11:51:35 浏览:955
赛风怎么用安卓 发布:2024-11-30 11:42:28 浏览:982
安卓怎么充高会 发布:2024-11-30 11:29:49 浏览:657
什么是手机本地服务器ip 发布:2024-11-30 11:13:21 浏览:289
压缩袋无泵 发布:2024-11-30 11:13:11 浏览:677
去角质皮面膜怎么样配置 发布:2024-11-30 10:44:22 浏览:809