一.口袋模式定义
实际上很难判断手机是否处于口袋中,口袋场景太复杂,目前市场上口袋模式没有一个确定的定义,参考其它手机和自己做过产品。
定义:手机是处于竖立状态并且距离传感器是被遮挡。
实现原理:加速度传感器判断手机是否处于竖立状态,距离传感器判断是否被遮挡。
应用场景:1.来电铃声自动调到最大音,拿出口袋恢复之前声音大小。2.口袋模式下自动锁屏或灭屏,拿出口袋自动解锁或亮屏。。。可以根据产品定义功能。
下面代码是来电铃声自动调到最大音功能为例,该功能实在原生incallUi应用上实现,代码实现位置如下。
packages\apps\InCallUI\src\com\android\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 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 ;//变量声明 endpublic ProximitySensor ( Context context , AudioModeProvider audioModeProvider ,AccelerometerListener accelerometerListener ) {mContext = context ;mPowerManager = ( PowerManager ) context . getSystemService ( Context . POWER_SERVICE );