手机来电翻转静音功能,手机来电铃声响起,通过翻转手机是手机铃声变为静音状态。下面是在incallUi应用中实现的翻转静音功能只贴了关键代码部分,代码在ProximitySensor.java中实现。 代码中有注释如果需要移植到其它地方可以根据注释移植操作步骤: 手机屏幕朝上,将手机屏幕由上而下翻转。(可根据需求改变操作)//翻转静音变量声明 beginprivate static final float CRITICAL_DOWN_ANGLE = - 8.0f ;private static final float CRITICAL_UP_ANGLE = 8.0f ;
private static final int SPEED_SHRESHOLD = 800 ;private SensorManager mSensorManager ;private Sensor mGsensorAccelerometer ;private int mReverseDownFlg = - 1 ;
private float lastX ;private float lastY ;private float lastZ ;private static final int UPTATE_INTERVAL_TIME = 70 ;
float tMax = 1.0f ;float tMaxleft = 0.1f ;boolean isLeftRight = false ;private long lastUpdateTime ;private static final String FLIP_TO_MUTE = "flip_to_mute_call" ;SensorEventListener mySensorListener ;boolean disInRang = false ;int previousMuteMode = - 1 ;boolean mActFlag = false ;int previousRing = 0 ;boolean isRing = false ;AudioManager am ;//翻转静音变量声明 endpublic ProximitySensor ( Context context , AudioModeProvider audioModeProvider ,AccelerometerListener accelerometerListener ) {mContext = context ;mPowerManager = ( PowerManager ) context . getSystemService ( Context . POWER_SERVICE );if ( mPowerManager . isWakeLockLevelSupported ( PowerManager . PROXIMITY_SCREEN_OFF_WAKE_LOCK )) {mProximityWakeLock = mPowerManager . newWakeLock (PowerManager . PROXIMITY_SCREEN_OFF_WAKE_LOCK , TAG );} else {Log . w ( TAG , "Device does not support proximity wake lock." );mProximityWakeLock = null ;}mAccelerometerListener = accelerometerListener ;mAccelerometerListener . setListener ( this );
mDisplayListener = new ProximityDisplayListener (( DisplayManager ) context . getSystemService ( Context . DISPLAY_SERVICE ));mDisplayListener . register ();
mAudioModeProvider = audioModeProvider ;mAudioModeProvider . addListener ( this );//翻转静音变量初始化 beginam = ( AudioManager ) mContext . getSystemService ( Context . AUDIO_SERVICE );mSensorManager = ( SensorManager ) mContext . getSystemService ( Service . SENSOR_SERVICE );mGsensorAccelerometer = mSensorManager . getDefaultSensor ( Sensor . TYPE_ACCELEROMETER ); //获取加速度传感器mSensorManager . registerListener ( mGsensorListener , mGsensorAccelerometer , SensorManager . SENSOR_DELAY_NORMAL ); //注册传感器获取监听//翻转静音变量初始化 end}//传感器监听SensorEventListener mGsensorListener = new SensorEventListener () {
@Overridepublic void onAccuracyChanged ( Sensor sensor , int accuracy ) {}
@Overridepublic void onSensorChanged ( SensorEvent event ) {TelecomManager telecomManager = getTelecommService (); //获取telecom对象if ( telecomManager != null && telecomManager . isRinging ()) { //判断当前是否响铃isRing = true ;} else { //电话状态不再是响铃状态isRing = false ;Log . d ( TAG , "telecomManager not ring " );return ;}
long currentUpdateTime = System . currentTimeMillis ();long timeInterval = currentUpdateTime - lastUpdateTime ;
lastUpdateTime = currentUpdateTime ;float x = event . values [ SensorManager . DATA_X ];
float y = event . values [ SensorManager . DATA_Y ];
float z = event . values [ SensorManager . DATA_Z ];float deltaX = x - lastX ;float deltaY = y - lastY ;float deltaZ = z - lastZ ;float absx = Math . abs ( x );float absy = Math . abs ( y );float absz = Math . abs ( z );lastX = x ;lastY = y ;lastZ = z ;double speed = Math . sqrt ( deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ )/ timeInterval * 10000 ;if ( event . values [ SensorManager . DATA_Z ] >= CRITICAL_UP_ANGLE ){ //屏幕竖直朝上mReverseDownFlg = 0 ;} else if ( event . values [ SensorManager . DATA_Z ] <= CRITICAL_DOWN_ANGLE&& mReverseDownFlg == 0 ){ //屏幕竖直朝下mReverseDownFlg = 1 ;}
if ( absx > absy && absx > absz ) {if ( x > tMax ) {isLeftRight = true ;Log . d ( TAG , "turn left" + " isLeftRight = " + isLeftRight ); //手机向左边翻转} else if ( x < - tMax ){isLeftRight = true ;Log . d ( TAG , "turn right" + " isLeftRight = " + isLeftRight ); //手机向右边翻转}} else if ( absy > absx && absy > absz ) {if ( y > tMax ) {isLeftRight = true ;Log . d ( TAG , "turn up" + " isLeftRight = " + isLeftRight ); //手机竖直翻转头向上} else if ( y <- tMax ){isLeftRight = true ;Log . d ( TAG , "turn down" + " isLeftRight = " + isLeftRight ); //手机竖直翻转头向下}} else if ( absz > absx && absz > absy ) {if ( z > 0 ) {isLeftRight = true ;Log . d ( TAG , "screen up" ); //手机屏幕向上} else {if ( isLeftRight && mReverseDownFlg == 1 ){if ( Settings . System . getInt ( mContext . getContentResolver (), FLIP_TO_MUTE , 1 ) == 1 ){telecomManager . silenceRinger (); //判断为屏幕有上翻转到下,响铃静音Log . d ( TAG , "onSensorChanged set slince" ); //手机屏幕向下isLeftRight = false ;Log . d ( TAG , "screen down -------------------------->" );}}Log . d ( TAG , "screen down" + " isLeftRight = " + isLeftRight );}} else {android . util . Log . e ( "origen" , "unknow action" + " isLeftRight = " + isLeftRight );}}};
TelecomManager getTelecommService () {if ( mContext != null )return ( TelecomManager ) mContext . getSystemService ( Context . TELECOM_SERVICE );return null ;}
public void tearDown () {mAudioModeProvider . removeListener ( this );
mAccelerometerListener . enable ( false );mDisplayListener . unregister ();
turnOffProximitySensor ( true );//取消注册监听加速度传感器if ( mSensorManager != null ){mSensorManager . unregisterListener ( mGsensorListener );mSensorManager = null ;}}
手机来电翻转静音功能
最新推荐文章于 2018-09-18 14:13:52 发布