1、在Service中监听电话状态

package com.example.incomingcall.service;import android.app.Service;import android.content.Intent;import android.graphics.PixelFormat;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.view.WindowManager.LayoutParams;import android.widget.Button;import android.widget.TextView;import com.example.incomingcall.R;public class ShowAddressService extends Service {private static final String TAG = ShowAddressService.class.getSimpleName();private TelephonyManager tm;private MyPhoneListener listener;private WindowManager wm;private float x;private float y;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}// 在服务第一次被创建的时候 执行的方法@Overridepublic void onCreate() {super.onCreate();Log.e(TAG, "onCreate");wm = (WindowManager) getSystemService(WINDOW_SERVICE);tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);listener = new MyPhoneListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);}private class MyPhoneListener extends PhoneStateListener {private View v;private String incomingNumber; // 来电号码private WindowManager.LayoutParams params;/** * 当手机的电话状态发生改变的时候 调用的方法 */@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE: // 没有通话,静止状态Log.i(TAG, "CALL_STATE_IDLE");if (v != null) {wm.removeView(v);v = null;}if (this.incomingNumber != null) {// 模仿土司 利用窗体的管理服务 把一个布局展现到界面上v = View.inflate(getApplicationContext(),R.layout.show_marknumber, null);TextView tv = (TextView) v.findViewById(R.id.tv_mark_number);tv.setText("电话:" + this.incomingNumber);Button bt_mark_cancel = (Button) v.findViewById(R.id.bt_mark_cancel);bt_mark_cancel.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {Log.i(TAG, "onClick dismiss");if (v != null) {wm.removeView(v);v = null;}}});params = new LayoutParams();params.gravity = Gravity.CENTER;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;params.format = PixelFormat.TRANSLUCENT;params.type = WindowManager.LayoutParams.TYPE_PHONE;params.setTitle("号码标记");wm.addView(v, params);}break;case TelephonyManager.CALL_STATE_OFFHOOK: // 电话接通 或者挂断Log.i(TAG, "CALL_STATE_OFFHOOK");if (v != null) {wm.removeView(v);v = null;}break;case TelephonyManager.CALL_STATE_RINGING: // 响铃状态this.incomingNumber = incomingNumber;Log.e(TAG, "CALL_STATE_RINGING incomingNumber:"+ incomingNumber);// 模仿土司 利用窗体的管理服务 把一个布局展现到界面上v = View.inflate(getApplicationContext(),R.layout.show_address, null);TextView tv = (TextView) v.findViewById(R.id.tv_show_address);tv.setText("来电:" + incomingNumber);params = new LayoutParams();params.gravity = Gravity.TOP | Gravity.LEFT;params.x = 0;params.y = 0;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;params.format = PixelFormat.TRANSLUCENT;params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;params.setTitle("电话帮");v.setOnTouchListener(new OnTouchListener() {float mTouchStartX;float mTouchStartY;@Overridepublic boolean onTouch(View v, MotionEvent event) {// 获取相对屏幕的坐标,即以屏幕左上角为原点x = event.getRawX();y = event.getRawY() - 25; // 25是系统状态栏的高度Log.i(TAG, "currX" + x + "====currY" + y);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 获取相对View的坐标,即以此View左上角为原点mTouchStartX = event.getX();mTouchStartY = event.getY();Log.i("startP", "startX" + mTouchStartX+ "====startY" + mTouchStartY);break;case MotionEvent.ACTION_MOVE://更新浮动窗口位置参数  params.x=(int)( x-mTouchStartX);  params.y=(int) (y-mTouchStartY);  wm.updateViewLayout(v, params);  break;case MotionEvent.ACTION_UP://更新浮动窗口位置参数  params.x=(int)( x-mTouchStartX);  params.y=(int) (y-mTouchStartY);  wm.updateViewLayout(v, params);  //可以在此记录最后一次的位置mTouchStartX = mTouchStartY = 0;break;}return true;}});wm.addView(v, params);break;}}}/** * 服务在被停止的时候 调用的方法 */@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();// 停止 电话状态的监听.tm.listen(listener, PhoneStateListener.LISTEN_NONE);}}



2、添加权限

    





更多相关文章

  1. Android平台开发-Power management-电源管理
  2. 监听电话状态
  3. Android触摸事件的传递(八)-View
  4. Android待机流程分析
  5. Android(安卓)MTP之服务端UsbService启动
  6. Android权限问题整理
  7. android 开发中判断网络是否连接的代码
  8. Android(安卓)状态栏透明
  9. Android(安卓)电话的反射调用机制实现静默接听电话

随机推荐

  1. Python可以比C++更快,你不信?
  2. 求求你,别用 print 来 debug 了
  3. 谷歌推出人工智能DIY套件:用硬纸板打造你
  4. 谁来接棒深度学习?
  5. IBM推出开源工具帮AI抵御对抗性样本***:DN
  6. 苹果重新开源分布式数据库FoundationDB,已
  7. Segment 放弃了微服务
  8. 90亿美元的“近十年第一版权案”,谷歌、甲
  9. 拜互联网所赐,软件市场和企业规模因此扩大
  10. 数组函数、json、ajax、cors跨域