當前位置:首頁 » 安卓系統 » 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

熱點內容
shell腳本日誌輸出 發布:2024-05-03 06:31:04 瀏覽:713
伺服器快捷方式是什麼意思 發布:2024-05-03 06:28:18 瀏覽:108
我的世界怎麼成為伺服器最靚的仔 發布:2024-05-03 06:26:44 瀏覽:853
安卓手機用博雅mm1用什麼軟體 發布:2024-05-03 06:19:23 瀏覽:693
演算法鍵值 發布:2024-05-03 06:16:52 瀏覽:5
qq密碼哪裡開啟 發布:2024-05-03 06:03:23 瀏覽:579
全排列的遞歸演算法 發布:2024-05-03 05:42:28 瀏覽:901
肥胖的演算法 發布:2024-05-03 05:38:09 瀏覽:783
兩個資料庫事務 發布:2024-05-03 05:33:41 瀏覽:855
phpjson轉 發布:2024-05-03 05:33:40 瀏覽:659