admin
2021-03-06 47dedd862b60ccecea34b5faba5c3cf64dd2b7d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.lcjian.library;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.WindowManager;
import android.widget.TextView;
 
public class PhoneCallReceiver extends BroadcastReceiver {
 
    private static final String TAG = "PhoneCallReceiver";
 
    private static boolean incomingFlag = false;
 
    private static String incomingNumber = null;
    
    private static WindowManager wm;
    
    private static TextView tv;
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // 如果是拨打电话
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            incomingFlag = false;
            String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.i(TAG, "call OUT:" + phoneNumber);
        } else {
            // 如果是来电
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
 
            switch (tm.getCallState()) {
            case TelephonyManager.CALL_STATE_RINGING: {
                incomingFlag = true;// 标识当前是来电
                incomingNumber = intent.getStringExtra("incoming_number");
                
                wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                WindowManager.LayoutParams params = new WindowManager.LayoutParams();
                params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
                params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
                params.width = WindowManager.LayoutParams.WRAP_CONTENT;
                params.height = WindowManager.LayoutParams.WRAP_CONTENT;
                params.format = PixelFormat.RGBA_8888;
                tv = new TextView(context);
                tv.setText("这是悬浮窗口,来电号码:" + incomingNumber);
                wm.addView(tv, params);
                
                Log.i(TAG, "RINGING :" + incomingNumber);
                break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {
                if (incomingFlag) {
                    Log.i(TAG, "incoming ACCEPT :" + incomingNumber);
                }
                break;
            }
            case TelephonyManager.CALL_STATE_IDLE: {
                if (incomingFlag) {
                    if (wm != null) {
                        wm.removeView(tv);
                    }
                }
                Log.i(TAG, "incoming IDLE");
                break;
            }
            }
        }
    }
}