Android入門筆記之根據手機姿態改變手機模式
<1>簡介
學習SensorManager和AudioManager
<2>關鍵步驟
SensorManager 允許你訪問設備的感應器。通過傳入參數SENSOR_SERVICE參數調用Context.getSystemService方法可以獲得一個sensor的實例。永遠記得確保當你不需要的時候,特別是Activity暫定的時候,要關閉感應器。忽略這一點肯能導致幾個小時就耗盡電池,注意當屏幕關閉時,系統不會自動關閉感應器。
下面顯示了Sensor所提供的所有服務
Constants
int TYPE_ACCELEROMETER A constant describing an accelerometersensor type. //三軸加速度感應器 返回三個座標軸的加速度 單位m/s2
int TYPE_ALL A constant describing all sensor types. //用於列出所有感應器
int TYPE_GRAVITY A constant describing a gravity sensor type. //重力感應器
int TYPE_GYROSCOPE A constant describing a gyroscope sensor type //陀螺儀 可判斷方向 返回三個座標軸上的角度
int TYPE_LIGHT A constant describing an light sensor type. //光線感應器 單位lux 勒克斯
int TYPE_LINEAR_ACCELERATION A constant describing a linearacceleration sensor type. //線性加速度
intTYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.//磁場感應 返回三個
座標軸的數值 微特斯拉
intTYPE_ORIENTATION This constant is deprecated. useSensorManager.getOrientation() instead. //方向感應器 已過時 可以使用方法獲得
int TYPE_PRESSURE A constant describing a pressure sensor type //壓力感應器 單位 千帕斯卡
int TYPE_PROXIMITY A constant describing an proximity sensor type.//距離傳感器
int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type.//翻轉傳感器
int TYPE_TEMPERATURE A constant describing a temperature sensor type //溫度傳感器 單位 攝氏度
此類中包含的方法都是get型的 用來獲取所選sensor的一些屬性,sensor類一般不需要new而是通過SensorManager的方法獲得
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);很顯然我獲得的是光線感應器的引用
SensorListener->Thisinterface was deprecated in API level 3.
Use SensorEventListener instead.
通過
AudioManageram=(AudioManager)getSystemService(Context.AUDIO_SERVICE)的getRingerMode()來獲取狀態參數,來判斷手機狀態。
<3>出現的問題
不要忘記將新的Activity在android manifest.xml中註冊一下。
<4>代碼及解釋
ChangeStateActivity:
package com.func;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.test.R;
public class ChangeStateActivity extends Activity{
/**
* @ProjectName: [androidtest]
* @Package: [com.func.ChangeStateActivity.java]
* @ClassName: [ChangeStateActivity]
* @Description:
* @Author: [gmj]
* @CreateDate: [2013-9-15 下午1:26:00]
* @Version: [v1.0]
*/
private SensorManager sm;
int msg;
EditText etYaw;
EditText etPitch;
EditText etRow;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_changestate);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//強制豎屏
etYaw=(EditText)this.findViewById(R.id.stateet1);
etPitch=(EditText)this.findViewById(R.id.stateet2);
etRow=(EditText)this.findViewById(R.id.stateet3);
tv=(TextView)this.findViewById(R.id.statetv4);
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
//獲取當前的AudioManager模式
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
msg=am.getRingerMode();//獲取狀態常數
}
}catch(Exception e)
{
e.printStackTrace();
}
switch(msg)
{
case AudioManager.RINGER_MODE_NORMAL://正常模式
Toast.makeText(
ChangeStateActivity.this,
"正常模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手機現在的模式爲:"+"正常模式");
break;
case AudioManager.RINGER_MODE_SILENT://靜音模式
Toast.makeText(
ChangeStateActivity.this,
"靜音模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手機現在的模式爲:"+"靜音模式");
break;
case AudioManager.RINGER_MODE_VIBRATE://震動模式
Toast.makeText(
ChangeStateActivity.this,
"震動模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手機現在的模式爲:"+"震動模式");
break;
}
}
private SensorListener mySensorListener=new SensorListener()
{
@Override
public void onAccuracyChanged(int sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(int sensor, float[] values) {
// TODO Auto-generated method stub
float yaw=values[SensorManager.DATA_X];
float pitch=values[SensorManager.DATA_Y];
float row=values[SensorManager.DATA_Z];
etYaw.setText(yaw+"");
etPitch.setText(pitch+"");
etRow.setText(row+"");
if(pitch<-120)
{//人爲規定小於-120時爲,手機反倒背面
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
//am.setRingerMode(AudioManager.RINGER_MODE_SILENT);//靜音模式
am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);//震動模式
tv.setText("手機現在的模式爲:"+"震動模式");
}
}catch(Exception e)
{
e.printStackTrace();
}
}else
{
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//正常模式
tv.setText("手機現在的模式爲:"+"正常模式");
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
};
@Override
public void onResume()
{
super.onResume();
sm.registerListener(mySensorListener, SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onPause()
{
super.onPause();
sm.unregisterListener(mySensorListener);
}
@Override
public boolean onKeyDown(int keyCode,KeyEvent e)//重寫鍵按下方法
{
if(keyCode==4)//按下返回鍵
{
System.exit(0);
}
return true;
}
}