您的位置:首页 > 其它

服务中电话状态的监听

2017-01-19 23:58 309 查看
public class AddressService extends Service {
public static final String tag = "AddressService";
private TelephonyManager mTM;
private MyPhoneStateListener mPhoneStateListener;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
private View mViewToast;
private WindowManager mWM;
private String mAddress;
private TextView tv_toast;
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
tv_toast.setText(mAddress);
};
};
private int[] mDrawableIds;

@Override
public void onCreate() {
//第一次开启服务以后,就需要去管理吐司的显示
//电话状态的监听(服务开启的时候,需要去做监听,关闭的时候电话状态就不需要监听)
//1,电话管理者对象
mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//2,监听电话状态
mPhoneStateListener = new MyPhoneStateListener();
mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
//获取窗体对象
mWM = (WindowManager) getSystemService(WINDOW_SERVICE);

super.onCreate();
}

class MyPhoneStateListener extends PhoneStateListener{
//3,手动重写,电话状态发生改变会触发的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
//空闲状态,没有任何活动(移除吐司)
Log.i(tag, "挂断电话,空闲了.......................");
//挂断电话的时候窗体需要移除吐司
if(mWM!=null && mViewToast!=null){
mWM.removeView(mViewToast);
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话
break;
case TelephonyManager.CALL_STATE_RINGING:
//响铃(展示吐司)
Log.i(tag, "响铃了.......................");
showToast(incomingNumber);
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}

public void showToast(String incomingNumber) {
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
//                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE    默认能够被触摸
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
//在响铃的时候显示吐司,和电话类型一致
params.type = WindowManager.LayoutParams.TYPE_PHONE;
params.setTitle("Toast");

//指定吐司的所在位置(将吐司指定在左上角)
params.gravity = Gravity.LEFT+Gravity.TOP;

//吐司显示效果(吐司布局文件),xml-->view(吐司),将吐司挂在到windowManager窗体上
mViewToast = View.inflate(this, R.layout.toast_view, null);
tv_toast = (TextView) mViewToast.findViewById(R.id.tv_toast);

//从sp中获取色值文字的索引,匹配图片,用作展示
mDrawableIds = new int[]{
R.drawable.call_locate_white,
R.drawable.call_locate_orange,
R.drawable.call_locate_blue,
R.drawable.call_locate_gray,
R.drawable.call_locate_green};
int toastStyleIndex = SpUtil.getInt(getApplicationContext(), ConstantValue.TOAST_STYLE, 0);
tv_toast.setBackgroundResource(mDrawableIds[toastStyleIndex]);

//在窗体上挂在一个view(权限)
mWM.addView(mViewToast, params);

//获取到了来电号码以后,需要做来电号码查询
query(incomingNumber);
}

private void query(final String incomingNumber) {
new Thread(){
public void run() {
mAddress = AddressDao.getAddress(incomingNumber);
mHandler.sendEmptyMessage(0);
};
}.start();
}

@Override
public void onDestroy() {
//取消对电话状态的监听(开启服务的时候监听电话的对象)
if(mTM!=null && mPhoneStateListener!=null){
mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
super.onDestroy();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: