在Android系统框架里实现翻转静音;
利用java的观察者模式可以轻松实现来电翻转静音;
服务类程序代码:
package com.example.smartcalltest;import android.app.Service;import android.content.Context;import android.content.Intent;import android.hardware.Sensor;import android.hardware.SensorManager;import android.media.AudioManager;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import com.example.smartcalltest.SensorProviderService.OnTurnPhoneDownListener;public class LewaTurnSilentService extends Service{private TelephonyManager mTelephonyMgr;private SensorManager mSensorMgr;private AudioManager mAudioMgr;private Sensor mSensor;private int mRingerMode;private SensorProviderService mSensorProviderSer = null;private boolean mVibRinging;private boolean mSensorFlag = false;private boolean mUpwardFlag = false;private boolean DEBUG = true;@Overridepublic void onCreate() {super.onCreate();if (DEBUG) {Log.i(TAG, "onCreate");}mTelephonyMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);mTelephonyMgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);mAudioMgr = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);mSensorMgr = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return START_STICKY;}@Overridepublic void onDestroy() {if (DEBUG) {Log.i(TAG, "onDestroy");}if (true == mSensorFlag) {mSensorProviderSer.unregisterSensorEventerListener(2);mSensorFlag = false;}mTelephonyMgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);super.onDestroy();}public void TurnSilentRing() {mSensorProviderSer.setOnTurnPhoneDownListener(new OnTurnPhoneDownListener() {@Overridepublic void onTurnPhoneDown() {// TODO Auto-generated method stubmAudioMgr.setRingerMode(AudioManager.RINGER_MODE_SILENT);mSensorProviderSer.unregisterSensorEventerListener(2);}});}private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_RINGING:if (false == mSensorFlag) {mRingerMode = mAudioMgr.getRingerMode();//mVibRinging = mAudioManagerHelper.isVibrationEnabled();if (AudioManager.RINGER_MODE_SILENT != mRingerMode) {mSensorProviderSer = new SensorProviderService(LewaTurnSilentService.this);mSensorProviderSer.registerSensorEventerListener(2);TurnSilentRing();mSensorFlag = true;}}break;case TelephonyManager.CALL_STATE_OFFHOOK:case TelephonyManager.CALL_STATE_IDLE:if (true == mSensorFlag) {mSensorProviderSer.unregisterSensorEventerListener(2);mAudioMgr.setRingerMode(mRingerMode);//mAudioManagerHelper.setVibrationEnabled(mVibRinging);mSensorFlag = false;mUpwardFlag = false;}break;default:break;}}};}
利用加速度传感器监听,自己封装的接口;
private final SensorEventListener mAccelerometerEventListener2 = new SensorEventListener() {@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubif (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {if (event.values[2] > 5) {mPhoneScreenUp = true;} else {if (mPhoneScreenUp && event.values[2] < -3.0f) {mTurnPhoneUp = true;onTurnPhoneDownListener.onTurnPhoneDown();}}}}};
public void setOnTurnPhoneDownListener(OnTurnPhoneDownListener listener) {onTurnPhoneDownListener = listener;}public interface OnTurnPhoneDownListener {public void onTurnPhoneDown();}
最后用的时候不要忘了,注册和注销监听器哦……
如果觉得《Android之翻转静音》对你有帮助,请点赞、收藏,并留下你的观点哦!