手机来电翻转静音功能

 
 
手机来电翻转静音功能,手机来电铃声响起,通过翻转手机是手机铃声变为静音状态。
下面是在incallUi应用中实现的翻转静音功能只贴了关键代码部分,
代码在ProximitySensor.java中实现。 代码中有注释如果需要移植到其它地方可以根据注释移植
操作步骤: 手机屏幕朝上,将手机屏幕由上而下翻转。(可根据需求改变操作)
//翻转静音变量声明 begin
private 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 ;
//翻转静音变量声明 end
public 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 );
//翻转静音变量初始化 begin
am = ( 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 () {

@Override
public void onAccuracyChanged ( Sensor sensor , int accuracy ) {
}

@Override
public 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 ;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值