一.口袋模式定义
实际上很难判断手机是否处于口袋中,口袋场景太复杂,目前市场上口袋模式没有一个确定的定义,参考其它手机和自己做过产品。
定义:手机是处于竖立状态并且距离传感器是被遮挡。
实现原理:加速度传感器判断手机是否处于竖立状态,距离传感器判断是否被遮挡。
应用场景:1.来电铃声自动调到最大音,拿出口袋恢复之前声音大小。2.口袋模式下自动锁屏或灭屏,拿出口袋自动解锁或亮屏。。。可以根据产品定义功能。
下面代码是来电铃声自动调到最大音功能为例,该功能实在原生incallUi应用上实现,代码实现位置如下。
packages\apps\InCallUI\src\com\android\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 Sensor mGsensorProximity;//距离传感器
private
int
mReverseDownFlg
=
-
1
;
private
float
lastX
;
private
float
lastY
;
private
float
lastZ
;
private
static
final
int
UPTATE_INTERVAL_TIME
=
70
;
private static final String POCKET_MODE = "pocket_mode_for_call";
float
tMax
=
1.0f
;
float
tMaxleft
=
0.1f
;
private
long
lastUpdateTime
;
SensorEventListener
mySensorListener
;
boolean
disInRang
=
false
;
int
previousMuteMode
=
-
1
;
boolean
mActFlag
=
false
;
boolean isPocket = false;
float distance = 10;
float MAXRANGDISTANCE =1.0f;
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
);