android sensor manager server

以下是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编程:

     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);

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值