(转)Android反面自动静音

悦知文件出版的《Android SDK 开发范例大全》上有一个例子,就是当手机反过来时自动静音,这里面涉及到传感器的编程,今天练手,输入了一下,发现需要完善几个问题(书上只是点到为止嘛,更多的工作需要自己再努力 :-) ):

1.如果旋转方向为X方向也应该自动静音

2.如果已设置了静音或普通模式则不需要再重复设置

3.在模拟器上有可能检测不到传感器,所以需要判断处理

 

下面贴出我完善了一下的代码,当然还有待改进(已重构了部分代码)  :-)



  1. package com.ad.android.reversemute;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.hardware.Sensor;
  6. import android.hardware.SensorEvent;
  7. import android.hardware.SensorEventListener;
  8. import android.hardware.SensorManager;
  9. import android.media.AudioManager;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.widget.TextView;
  13. public class MainActivity extends Activity
  14. {
  15.     /** Called when the activity is first created. */
  16.     private SensorManager mSensorManager;
  17.     private boolean mRegisteredSensor;
  18.     private TextView mtvStatus;
  19.     private int intCurRingerMode;
  20.     private final String TAG="ReverseMute";
  21.    
  22.    
  23.     @Override
  24.     public void onCreate(Bundle savedInstanceState)
  25.     {
  26.         super.onCreate(savedInstanceState);
  27.         setContentView(R.layout.main);
  28.         
  29.         mtvStatus=(TextView)findViewById(R.id.tvStatus);
  30.         mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
  31.         //取得现在的AudioManager模式显示在TextView中
  32.         intCurRingerMode=GetAudioManagerMode();
  33.         SetStatus(intCurRingerMode);
  34.     }
  35.    
  36.     private void SetStatus(String info)
  37.     {
  38.         mtvStatus.setText(info);
  39.     }
  40.    
  41.     private void SetStatus(int mode)
  42.     {
  43.         switch(mode)
  44.         {
  45.             //正常模式
  46.             case AudioManager.RINGER_MODE_NORMAL:
  47.                 mtvStatus.setText(R.string.str_normal_mode);
  48.                 break;
  49.             case AudioManager.RINGER_MODE_SILENT:
  50.                 mtvStatus.setText(R.string.str_silent_mode);
  51.                 break;
  52.             case AudioManager.RINGER_MODE_VIBRATE:
  53.                 mtvStatus.setText(R.string.str_vibrate_mode);
  54.                 break;
  55.         }
  56.     }
  57.    
  58.     //取得当前的AudioManager模式
  59.     private int GetAudioManagerMode()
  60.     {
  61.         int r=-1;
  62.         try
  63.         {
  64.             AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
  65.             if(audioManager!=null)
  66.             {
  67.                 r=audioManager.getRingerMode();
  68.             }
  69.         }
  70.         catch(Exception e)
  71.         {
  72.             mtvStatus.setText(e.toString());
  73.             e.printStackTrace();
  74.         }
  75.         return r;
  76.     }
  77.    
  78.     //创建SensorListener捕捉onSensorChanged事件
  79.     private final SensorEventListener mSensorListener=new SensorEventListener()
  80.     {
  81.         @Override
  82.         public void onAccuracyChanged(Sensor sensor,int accuracy)
  83.         {
  84.             //TODO
  85.         }
  86.         
  87.         @Override
  88.         public void onSensorChanged(SensorEvent event)
  89.         {
  90.             if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
  91.             {
  92.                 //取得平面左右倾斜的Pitch角度
  93.                 float x=event.values[SensorManager.DATA_X];
  94.                 float y=event.values[SensorManager.DATA_Y];
  95.                 //float z=event.values[SensorManager.DATA_Z];
  96.                
  97.                 //正面向下(Y轴旋转),经实验结果为小于-120为翻背面
  98.                 //同样,增加对X轴旋转的判断
  99.                 if(y<-120|x<-120)
  100.                 {
  101.                     //如果已经设置,则不再重复设置
  102.                     if(intCurRingerMode==AudioManager.RINGER_MODE_NORMAL)
  103.                     {   
  104.                         //先设置为静音模式
  105.                         SetRingMode(AudioManager.RINGER_MODE_SILENT);
  106.                         //再设置为振动模式
  107.                         SetRingMode(AudioManager.RINGER_MODE_VIBRATE);
  108.                         intCurRingerMode=AudioManager.RINGER_MODE_SILENT;
  109.                     }
  110.                     Log.i(TAG,"正面朝下");
  111.                 }
  112.                 else  //正面朝上
  113.                 {
  114.                     if(intCurRingerMode==AudioManager.RINGER_MODE_SILENT)
  115.                     {
  116.                         SetRingMode(AudioManager.RINGER_MODE_NORMAL);
  117.                         intCurRingerMode=AudioManager.RINGER_MODE_NORMAL;
  118.                     }
  119.                     Log.i(TAG,"正面朝上");
  120.                 }
  121.                
  122.             }
  123.         }
  124.         
  125.         private void SetRingMode(int mode)
  126.         {
  127.             try
  128.             {
  129.                 AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
  130.                 if(audioManager!=null)
  131.                 {
  132.                     audioManager.setRingerMode(mode);
  133.                 }
  134.                 SetStatus(mode);
  135.             }
  136.             catch(Exception e)
  137.             {
  138.                 mtvStatus.setText(e.toString());
  139.                 e.printStackTrace();
  140.             }
  141.         }
  142.    };
  143.    
  144.    @Override
  145.    protected void onPause() {
  146.         // TODO Auto-generated method stub
  147.            if(mRegisteredSensor)
  148.            {
  149.                mSensorManager.unregisterListener(mSensorListener);
  150.            }
  151.         super.onPause();
  152.     }
  153.     @Override
  154.     protected void onResume() {
  155.         // TODO Auto-generated method stub
  156.         List<Sensor> sensors=mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
  157.         try
  158.         {
  159.             //在模拟器上可能找不到传感器,所以如果不判断sensors的size的话在模拟器上调试会引发异常
  160.             if(sensors.size()>=1)
  161.             {
  162.                 mRegisteredSensor=mSensorManager.registerListener(mSensorListener,sensors.get(0),SensorManager.SENSOR_DELAY_NORMAL);
  163.             }
  164.             else
  165.             {
  166.                 mtvStatus.setText("没有找到传感器");
  167.             }
  168.         }
  169.         catch(Exception e)
  170.         {
  171.             mtvStatus.setText(e.toString());
  172.             e.printStackTrace();
  173.         }
  174.         super.onResume();
  175.     }
posted @ 2012-03-30 11:17  幻星宇  阅读(299)  评论(0编辑  收藏  举报