導航:首頁 > 操作系統 > android感測器代碼

android感測器代碼

發布時間:2022-08-26 11:47:04

『壹』 android加速度感測器怎麼使用

使用加速度感測器與其他感測器的方法大致相同,通過調用系統API就可以實現。分為以下幾步:
1.獲取SensorManager
2.使用SensorManager獲取加速度感測器
3.創建自定義的感測器監聽函數,並注冊
4.相對應的,在合適位置實現注銷監聽器的調用
簡單的代碼如下:
public class MainActivity extends Activity {

private static final String TAG = "SensorTest";

private SensorManager mSensorManager;
private Sensor mAccelerometer;
private TestSensorListener mSensorListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initViews();

// 初始化感測器
mSensorListener = new TestSensorListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}

@Override
protected void onResume() {
super.onResume();
// 注冊感測器監聽函數
mSensorManager.registerListener(mSensorListener, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
}

@Override
protected void onPause() {
super.onPause();
// 注銷監聽函數
mSensorManager.unregisterListener(mSensorListener);
}

private void initViews() {
mSensorInfoA = (TextView) findViewById(R.id.sensor_info_a);
}

class TestSensorListener implements SensorEventListener {

@Override
public void onSensorChanged(SensorEvent event) {
// 讀取加速度感測器數值,values數組0,1,2分別對應x,y,z軸的加速度
Log.i(TAG, "onSensorChanged: " + event.values[0] + ", " + event.values[1] + ", " + event.values[2]);

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i(TAG, "onAccuracyChanged");
}

}

}

『貳』 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);
}
}
}

『叄』 如何在Android studio上用加速度感測器通過兩次積分得到位移,最好有代碼

感覺題目有點不是太清晰,是類似搖一搖的功能嗎,我給一個搖一搖的例子 可計算X、Y、Z軸方向的加速度,核心代碼如下

@Override
publicvoidonSensorChanged(SensorEventevent){
inttype=event.sensor.getType();

if(type==Sensor.TYPE_ACCELEROMETER){
//獲取三個方向值
float[]values=event.values;
floatx=values[0];
floaty=values[1];
floatz=values[2];

if((Math.abs(x)>17||Math.abs(y)>17||Math
.abs(z)>17)&&!isShake){
isShake=true;
//TODO:2016/10/19實現搖動邏輯,搖動後進行震動
Threadthread=newThread(){
@Override
publicvoidrun(){
super.run();
try{
Log.d(TAG,"onSensorChanged:搖動");

//開始震動發出提示音展示動畫效果
mHandler.obtainMessage(START_SHAKE).sendToTarget();
Thread.sleep(500);
//再來一次震動提示
mHandler.obtainMessage(AGAIN_SHAKE).sendToTarget();
Thread.sleep(500);
mHandler.obtainMessage(END_SHAKE).sendToTarget();

}catch(InterruptedExceptione){
e.printStackTrace();
}
}
};
thread.start();
}
}
}

詳細的可以參考 github網頁鏈接 要是有什麼不清楚的可以繼續追問

『肆』 Android 光照感測器精度問題

Android感測器編程入門,分別包括加速度感測器(accelerometer),陀螺儀(gyroscope),環境光照感測器(light),磁力感測器(magnetic field),方向感測器(orientation),壓力感測器(pressure),距離感測器(proximity)和溫度感測器(temperature)一、前言我很喜歡電腦,可是筆記本還是太大,筆記本電腦再小還是要弄個小包背起來的,智能手機則不同,它完全就是一個手機,可以隨意裝在一個口袋裡隨身攜帶。因此我在2002年左右時最喜歡玩裝備是Dell的PDA,2007年的時候最喜歡玩的是N73,而在2010年最喜歡玩的則是Milestone。眼見著手機的功能越來越強,時至今日智能手機甚至在某些方面已經強過了台式機和筆記本。本節課講的就是智能手機強過台式機和筆記本的地方:感測器。

『伍』 如何在android的驅動程序中對加速度感測器的數據進行方向和坐標的轉

一部智能手機或便攜設備應具有Wi-Fi 和互聯網功能,能夠運行應用軟體等諸多特徵,而且一定會具有內置感測器。高端智能手機可能集成接近感測器,環境光感測器,3
軸加速度計,以及磁力計等多種感測器。 Android 2.3
添加了一些支持多種新型感測器的API,包括陀螺儀、旋轉向量、線性加速度、重力和氣壓感測器等。應用軟體可以使用這些新型感測器,將它們組合起來,就可以實現高精確度的高級運動檢測功能。

3 軸加速度計或低g 值感測器是Android API
支持的感測器之一,具有特定的坐標系統,可以給應用程序提供標準的介面數據。坐標空間的定義與手機屏幕的默認方向有關,如圖1所示。



1. 3 軸加速度計的Android 坐標系統

在Android 坐標系統中,坐標原點位於屏幕的左下角,X 軸水平指向右側,Y 軸垂直指向頂部,Z
軸指向屏幕前方。在該系統中,屏幕後方的坐標具有負的Z 軸值。Android 加速度計數據定義為:

Sensor.TYPE_ACCELEROMETER

所有數值都採用SI
標准單位(m/s2),測量手機的加速度值,並減去重力加速度分量。

values[0]:x 軸上的加速度值減去Gx
values[1]:y
軸上的加速度值減去Gy
values[2]:z 軸上的加速度值減去Gz

例如,當設備平放在桌上並推著其左側向右移動時,x
軸加速度值為正。當設備平放在桌上時,加速度值為+9.81,這是用設備的加速度值 (0 m/s2) 減去重力加速度值 (-9.81 m/s2)得到的。


當設備平放在桌上放,並以加速度A m/s2 朝天空的方向推動時,加速度值等於A+9.81,這是用設備加速度值(+A
m/s2)減去重力加速度值(-9.81 m/s2)得到的。

表 1
列出了與設備的各個位置相對應的感測器的加速度值讀數。用戶可以用下表檢查加速度計的方向與系統坐標是否一致。

在 Android HAL 文件中改變 X、Y 和Z 軸的方向

在 HAL
文件中,會有一組宏定義,用於把從感測器中讀取的加速度數據轉換為標准單位(m/s2)。如以下代碼:

// conversion of
acceleration data to SI units (m/s^2)
#define CONVERT_A (GRAVITY_EARTH /
LSG)
#define CONVERT_A_X (-CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)

#define CONVERT_A_Z (CONVERT_A)

在這個宏定義中,常量GRAVITY_EARTH
是一個標准重力加速度值,即9.81m/s2,LSG為一個重力加速度值的最小有效計數值,例如,MMA8452
在正常模式下的讀數為1024。因此,CONVERT_A 用於把從加速度感測器中讀取的數據,從數字讀數轉換為標准重力加速度單位。


通過分別修改CONVERT_A_X、CONVERT_A_Y 和CONVERT_A_Z,我們可以輕松地改變X、Y 和Z
軸的方向。如果該軸的方向與系統定義相反,可以使用(-CONVERT_A)來改變其方向。如果方向一致,就使用(CONVERT_A),則保持方向不變。


這個宏定義位於FSL Android 9 (Android 2.2)驅動程序的HAL文件sensor.c 中。對於FSLAndroid 10
(Android 2.3),您可以在』libsensors』文件夾的HAL 文件Sensor.h 中找到它。

在 Android 2.2 HAL
文件中交換X 軸和Y 軸

在某些情況下,X 和Y 軸必須進行交換,以便使感測器數據的坐標與系統坐標保持一致。

對於 FSL
Android 9 (Android 2.2)驅動程序來說,X 軸和Y 軸的交換非常簡單。首先,在HAL 文件sensor.c
中,在函數sensor_poll() 中找到以下代碼:

switch (event.code) {
case ABS_X:

sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case
ABS_Y:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;

case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;

break;
}

然後,根據如下所示修改代碼:

switch (event.code) {
case
ABS_X:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;

case ABS_Y:
sSensors.acceleration.x = event.value * CONVERT_A_X;

break;
case ABS_Z:
sSensors.acceleration.z = event.value *
CONVERT_A_Z;
break;
}

在 Android 2.3 的HAL 文件中交換X 軸和Y 軸


Android 2.3 的HAL 文件中交換X 軸和Y 軸會更加復雜些,因為它具有更復雜的HAL文件結構。所有HAL
文件都位於文件夾『libsensors』中。文件AccelSensor.cpp 中的兩個函數需要修改。


首先,修改函數AccelSensor()的代碼,如下所示:

if
(accel_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) {
mEnabled |=
1<<accelerometer; if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),
&absinfo)) {
mPendingEvents[Accelerometer].acceleration.y =
absinfo.value * CONVERT_A_Y;
}
if (!ioctl(data_fd,
EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {

mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X;

}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {

mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z;

}
}

然後,修改函數processEvent()的代碼,如下所示:

void
AccelSensor::processEvent(int code, int value)
{
switch (code) {

case EVENT_TYPE_ACCEL_X:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y;
break;

case EVENT_TYPE_ACCEL_Y:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X;
break;

case EVENT_TYPE_ACCEL_Z:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z;
break;

}
}

完成後,X 軸和Y 軸的數據就互相交換了。

在 Kernel 驅動文件中交換X 軸和Y 軸


X 軸和Y 軸的數據交換可以在底層的Linux 驅動中,在剛開始讀取感測器數據時實施。通過這種方法,無論感測器晶元以何種方式安裝在PCB
中,或者使用各種不同類型的感測器,HAL 文件都可以保持一致。

對於 Android 2.2 和2.3
來說,執行該操作的最便捷的方式是修改函數report_abs()中的代碼。在該函數中,感測器數據通過調用函數mma8452_read_data()讀取,如下所示(當使用的感測器為MMA8452Q
時):

if (mma8452_read_data(&x,&y,&z) != 0) {

//DBG("mma8452 data read failed ");
return; }

X 軸和Y
軸可以通過以下方式輕松交換:

if (mma8452_read_data(&y,&x,&z) != 0) {

//DBG("mma8452 data read failed ");
return; }

對於 Android
2.2,MMA8452 的Kernel 驅動文件為mma8452.c;對於Android 2.3,驅動文件是『hwmon』文件夾中的mxc_mma8452.c。


在 Kernel 驅動文件中改變 X、Y 和Z 軸的方向

感測器數據的方向也可以在Kernel
驅動文件中更改。以下帶有注釋的語句可以添加到函數report_abs()中,從而改變數據方向:

if
(mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read
failed ");
return;
}
x *= -1; //Reverse X direction
y *= -1;
//Reverse Y direction
z *= -1; //Reverse Z direction

input_report_abs(mma8452_idev->input, ABS_X, x);

input_report_abs(mma8452_idev->input, ABS_Y, y);

input_report_abs(mma8452_idev->input, ABS_Z, z);

input_sync(mma8452_idev->input);

總結

Android
系統已經為加速度計定義了坐標系統,因此用戶必須轉換從實際感測器中讀取的數據,從而與其保持一致。無論是否需要轉換,都應檢查X、Y 和Z
軸的方向以及X-Y軸坐標。我們可以更改HAL 文件或Kernel 驅動文件來改變軸的方向,或交換X 和Y 軸,但是不要同時修改HAL 文件和Kernel 驅動。

找找

『陸』 開發android應用程序怎麼調用光感測器

Android手機自帶光線感測器,通常我們手機的屏幕自動亮度都是用光線感測器來實現的。該感測器在前置攝像頭附近,此外,還有一個距離感測器。本文主要講解如何使用Android手機的光線感測器。

獲得感應器服務

Android開發中要使用光線感測器,需要先獲得系統感測器服務Context.SENSOR_SERVICE,獲得方法如下:

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

獲得光線感測器

SensorManager是系統感測器服務,是系統所有感測器的管理器。通過它,我們獲得制定類型的感測器,獲得光線感測器的方法如下:

詳細代碼

『柒』 如何實現多感測器同步採集數據實現的android studio代碼

放到線程里不停的輪循

『捌』 android溫度感測器獲得的是什麼溫度

1)溫度感測器返回當前的溫度,單位是攝氏度(°C)。

2)具體代碼如下

[java] view
plainprint?

package com.example.androidapp;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {

private SensorManager mSensorManager=null;

private Sensor mSensor=null;

private TextView textView1=null;

private Button button1=null;

private Button button2=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView1=(TextView)findViewById(R.id.textView1);

/*獲取系統服務(SENSOR_SERVICE)返回一個SensorManager對象*/

mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);

/*通過SensorManager獲取相應的(溫度感測器)Sensor類型對象*/

mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);

/*注冊相應的SensorService*/

button1=(Button)findViewById(R.id.button1);

button1.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

mSensorManager.registerListener(mSensorEventListener, mSensor

, SensorManager.SENSOR_DELAY_NORMAL);

}

});

/* 銷毀相應的SensorService

* 很關鍵的部分,注意,說明文檔中提到,即使Activity不可見的時候,感應器依然會繼續工作

* 所以一定要關閉觸發器,否則將消耗用戶大量電量*/

button2=(Button)findViewById(R.id.button2);

button2.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

mSensorManager.unregisterListener(mSensorEventListener, mSensor);

}

});

}

/*聲明一個SensorEventListener對象用於偵聽Sensor事件,並重載onSensorChanged方法*/

private final SensorEventListener mSensorEventListener=new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

if(event.sensor.getType()==Sensor.TYPE_TEMPERATURE){

/*溫度感測器返回當前的溫度,單位是攝氏度(°C)。*/

float temperature=event.values[0];

textView1.setText(String.valueOf(temperature)+"°C");

}

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

};

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

閱讀全文

與android感測器代碼相關的資料

熱點內容
nc65伺服器地址配置 瀏覽:520
單片機實驗報告電子琴 瀏覽:742
程序員恢復微信文件代碼 瀏覽:517
有漁python 瀏覽:79
pdf字體加深 瀏覽:204
怎麼做一個minecraft伺服器 瀏覽:769
c語言實現ls命令 瀏覽:663
小洋糕解壓視頻 瀏覽:450
域名內網訪問內網伺服器地址 瀏覽:138
我的世界伺服器如何摳掉金幣 瀏覽:223
域名與ip地址通過什麼伺服器查 瀏覽:95
企業網站需要什麼雲伺服器配置 瀏覽:910
遼事通伺服器出現錯誤是什麼原因 瀏覽:765
能否將一個表格的子表加密 瀏覽:63
手機ios微信收藏怎麼加密 瀏覽:594
安卓如何改黑色 瀏覽:331
oracle資料庫導出命令 瀏覽:696
用python做鍾表盤 瀏覽:874
腰椎壓縮性骨折吧 瀏覽:327
安卓怎麼把軟體改成火影忍者 瀏覽:704