本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下
关键代码:【PhoneUtils类】
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
package com.ebupt.phonerecorddemo.server; import java.lang.reflect.Method; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import android.util.Log; import android.view.KeyEvent; import com.android.internal.telephony.ITelephony; public class PhoneUtils { static String TAG = "PhoneUtils" ; /** * 从TelephonyManager中实例化ITelephony,并返回 */ static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception { Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod( "getITelephony" ); getITelephonyMethod.setAccessible( true ); // 私有化函数也能使用 return (ITelephony) getITelephonyMethod.invoke(telMgr); } //自动接听 public static void autoAnswerPhone(Context c,TelephonyManager tm) { try { Log.i(TAG, "autoAnswerPhone" ); ITelephony itelephony = getITelephony(tm); // itelephony.silenceRinger(); itelephony.answerRingingCall(); } catch (Exception e) { e.printStackTrace(); try { Log.e(TAG, "用于Android2.3及2.3以上的版本上" ); Intent intent = new Intent( "android.intent.action.MEDIA_BUTTON" ); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK); intent.putExtra( "android.intent.extra.KEY_EVENT" , keyEvent); c.sendOrderedBroadcast(intent, "android.permission.CALL_PRIVILEGED" ); intent = new Intent( "android.intent.action.MEDIA_BUTTON" ); keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); intent.putExtra( "android.intent.extra.KEY_EVENT" , keyEvent); c.sendOrderedBroadcast(intent, "android.permission.CALL_PRIVILEGED" ); Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG); localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); localIntent1.putExtra( "state" , 1 ); localIntent1.putExtra( "microphone" , 1 ); localIntent1.putExtra( "name" , "Headset" ); c.sendOrderedBroadcast(localIntent1, "android.permission.CALL_PRIVILEGED" ); Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON); KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK); localIntent2.putExtra( "android.intent.extra.KEY_EVENT" , localKeyEvent1); c.sendOrderedBroadcast(localIntent2, "android.permission.CALL_PRIVILEGED" ); Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON); KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); localIntent3.putExtra( "android.intent.extra.KEY_EVENT" , localKeyEvent2); c.sendOrderedBroadcast(localIntent3, "android.permission.CALL_PRIVILEGED" ); Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG); localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); localIntent4.putExtra( "state" , 0 ); localIntent4.putExtra( "microphone" , 1 ); localIntent4.putExtra( "name" , "Headset" ); c.sendOrderedBroadcast(localIntent4, "android.permission.CALL_PRIVILEGED" ); } catch (Exception e2) { e2.printStackTrace(); Intent meidaButtonIntent = new Intent( Intent.ACTION_MEDIA_BUTTON); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); c.sendOrderedBroadcast(meidaButtonIntent, null ); } } } //自动挂断 public static void endPhone(Context c,TelephonyManager tm) { try { Log.i(TAG, "endPhone" ); ITelephony iTelephony; Method getITelephonyMethod = TelephonyManager. class .getDeclaredMethod( "getITelephony" , (Class[]) null ); getITelephonyMethod.setAccessible( true ); iTelephony = (ITelephony) getITelephonyMethod.invoke(tm, (Object[]) null ); // 挂断电话 iTelephony.endCall(); } catch (Exception e) { e.printStackTrace(); } } } |
需要用到的ITelephony.aidl:
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
|
package com.android.internal.telephony; /** * Interface used to interact with the phone. Mostly this is used by the * TelephonyManager class. A few places are still using this directly. * Please clean them up if possible and use TelephonyManager instead. * {@hide} */ interface ITelephony { /** * End call or go to the Home screen * @return whether it hung up */ boolean endCall(); /** * Answer the currently-ringing call. * * If there's already a current active call, that call will be * automatically put on hold. If both lines are currently in use, the * current active call will be ended. * * TODO: provide a flag to let the caller specify what policy to use * if both lines are in use. (The current behavior is hardwired to * "answer incoming, end ongoing", which is how the CALL button * is specced to behave.) * * TODO: this should be a oneway call (especially since it's called * directly from the key queue thread). */ void answerRingingCall(); /** * Silence the ringer if an incoming call is currently ringing. * (If vibrating, stop the vibrator also.) * * It's safe to call this if the ringer has already been silenced, or * even if there's no incoming call. (If so, this method will do nothing.) * * TODO: this should be a oneway call too (see above). * (Actually *all* the methods here that return void can * probably be oneway.) */ void silenceRinger(); /** * Allow mobile data connections. */ boolean enableDataConnectivity(); /** * Disallow mobile data connections. */ boolean disableDataConnectivity(); /** * Report whether data connectivity is possible. */ boolean isDataConnectivityPossible(); } |
监听通话广播【PhoneReceiver.java】:
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
|
package com.ebupt.phonerecorddemo.server; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import android.util.Log; public class PhoneReceiver extends BroadcastReceiver { String TAG = "PhoneReceiver" ; @Override public void onReceive(Context context, Intent intent) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Service.TELEPHONY_SERVICE); switch (tm.getCallState()) { case TelephonyManager.CALL_STATE_OFFHOOK: // 电话打进来接通状态;电话打出时首先监听到的状态。 Log.i( "onCallStateChanged" , "CALL_STATE_OFFHOOK" ); break ; case TelephonyManager.CALL_STATE_RINGING: // 电话打进来状态 Log.i( "onCallStateChanged" , "CALL_STATE_RINGING" ); PhoneUtils.autoAnswerPhone(context,tm); break ; case TelephonyManager.CALL_STATE_IDLE: // 不管是电话打出去还是电话打进来都会监听到的状态。 Log.i( "onCallStateChanged" , "CALL_STATE_IDLE" ); break ; } } } |
在上面类适当的地方加上挂断或接通电话的代码即可。
最后别忘记在AndroidManifest.xml里声明和注册权限。
1
2
3
4
5
6
|
<uses-permission android:name= "android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name= "android.permission.PROCESS_OUTGOING_CALLS" > </uses-permission> <uses-permission android:name= "android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name= "android.permission.CALL_PHONE" /> |
1
2
3
4
5
6
|
< receiver android:name = "com.ebupt.phonerecorddemo.server.PhoneReceiver" > < intent-filter android:priority = "2147483647" > < action android:name = "android.intent.action.PHONE_STATE" > </ action > </ intent-filter > </ receiver > |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/viviwen123/article/details/9299503