• (转)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.     }
  • 相关阅读:
    用TPLINK 无线网卡设置无线工作环境
    ChartDirector与JFreeChart两款主要web图表工具调研报告
    发现奇怪的问题,TOMCAT居然跟本机网卡的DNS设置有关
    解决Oracle监听器服务不能启动的问题
    JAVA 调用 .NET写的WEBSERVICE
    Windows Forms 实现安全的多线程详解
    异步调用与多线程
    关于.NET异步调用的初步总结
    c#中的多线程同步
    WinForm界面开发
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2424887.html
Copyright © 2020-2023  润新知