Android入門筆記之 根據手機姿態改變手機模式

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

}


發佈了29 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章