以下是IBM网站上对android sensor的调用示例,
详见:http://www.ibm.com/developerworks/cn/opensource/os-android-sensor/
另有详细讲解:http://www.androidegg.com/portal.php?mod=list&catid=77
/*
* IBMEyes.java
* sample code for IBM Developerworks Article
* Author: W. Frank Ableson
* fableson@msiservices.com
*/
package com.msi.ibm.eyes;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.hardware.SensorManager;
import android.hardware.SensorListener;
public class IBMEyes extends Activity implements SensorListener {
//好像SensorListener被SensorEventListener给替代了,见http://www.elexcon.com/news/106150.html
final String tag = "IBMEyes";
SensorManager sm = null;
TextView xViewA = null;
TextView yViewA = null;
TextView zViewA = null;
TextView xViewO = null;
TextView yViewO = null;
TextView zViewO = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.main);
xViewA = (TextView) findViewById(R.id.xbox);
yViewA = (TextView) findViewById(R.id.ybox);
zViewA = (TextView) findViewById(R.id.zbox);
xViewO = (TextView) findViewById(R.id.xboxo);
yViewO = (TextView) findViewById(R.id.yboxo);
zViewO = (TextView) findViewById(R.id.zboxo);
}
public void onSensorChanged(int sensor, float[] values) {//sensor 值变化时调用的函数
synchronized (this) {
Log.d(tag, "onSensorChanged: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]);
if (sensor == SensorManager.SENSOR_ORIENTATION) {
xViewO.setText("Orientation X: " + values[0]);
yViewO.setText("Orientation Y: " + values[1]);
zViewO.setText("Orientation Z: " + values[2]);
}
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
xViewA.setText("Accel X: " + values[0]);
yViewA.setText("Accel Y: " + values[1]);
zViewA.setText("Accel Z: " + values[2]);
}
}
}
public void onAccuracyChanged(int sensor, int accuracy) {//sensor 精度变化时调用的函数
Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(this,
SensorManager.SENSOR_ORIENTATION |
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
sm.unregisterListener(this);
super.onStop();
}
}
--------------------------------------------
sensor编程:
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);
SensorListener
接口是传感器应用程序的中心。它包括两个必需方法:
-
onSensorChanged(int sensor,float values[])
方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用(更多内容见下文)。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。 - 当传感器的准确性更改时,将调用
onAccuracyChanged(int sensor,int accuracy)
方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。
--------------------------------------------
Android的sensor架构中,
SensorService(SensorService.java->com_android_server_SensorService.cpp)是主要起控制作用的,可以看到native中的控制接口都在这边,也就是device_open/close/setDelay
而数据则完全由SensorManager(SensorManager.java->android_hardware_SensorManager.cpp)负责,对应的natice接口是data_open/close/poll
每次调用getSystemService()函数时都初始化一个新的SensorManager实例,而这个SensorManager实例会在构造函数里通过取得传感器系统服务SensorService来实现对下层传感器的一些控制。而这个SensorService才是系统的传感器服务,说服务,不如说它只是SensorService类的一个实例罢了。它只在系统初始化时初始化一次。Android中的系统服务机制应该跟传感器的都差不多一个样,都是由不同的Manager调用下层相同的Service。你可以列举其它的Manager。那它是什么时候初始化呢?它是系统初始化在SystemServer进程里创建的,至于SystemServer请看相关的介绍。
(摘自:http://blog.csdn.net/JerryMo06/article/details/5487476)
android 转屏
很多时候,我们需要能在应用中得到当前的屏幕方向,并做一些处理。我们就可以用以下的方式:比如我们放置一个按钮,按下后,如果当前是横屏,就会自动转成竖屏,如果当前是竖屏,就会自动转成横屏:
我们可以随便在layout中放置一个按钮,在按钮中setOnClickListener,在onClick中添加如下代码就可实现:
// if Portrait change to LandScape
if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
//if LandScape change to Portrait
else if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
但以上方法有一个问题,就是必须设定一个默认的屏幕方向才可以,就是说我必须在AndroidManifest.xml中,配置一个默认的屏幕方向才可以,如添加以下配置:android:screenOrientation="portrait" ,不然就会失效,getRequestedOrientation这个方法得到的似乎也不一定是当前真实的屏幕方向,好像只是配置文件中的默认方向。
那如果我希望获取当前的屏幕方向呢?或者说我希望事实侦测当前转了多少角度该怎么做呢?其实还有另一种方法,可以通过OrientationEventListener来达到实时得到当前的屏幕转了多少角度,根据角度,你就可以来判断是横屏还是竖屏了呢,通过重写onOrientationChanged,你就可以得到角度值了,就可以做一些相应的处理了
public void onOrientationChanged(int orientation) {
// TODO Auto-generated method stub
if (OrientationEventListener.ORIENTATION_UNKNOWN != orientation) {
if (0 == orientation)
Log.e("MyNewLog", "Not change the Screen!!");
else if (90 == orientation)
Log.e("MyNewLog", "left side is at the top");
else if (180 == orientation)
Log.e("MyNewLog", "upside down");
else if (270 == orientation)
Log.e("MyNewLog", "right side is to the top");
}
}
转自:http://blog.csdn.net/xiaoxiao_job/article/details/5884008