前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android实现接通和挂断电话

android实现接通和挂断电话

作者头像
砸漏
发布2020-11-05 14:44:04
1.5K0
发布2020-11-05 14:44:04
举报
文章被收录于专栏:恩蓝脚本

本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下

关键代码:【PhoneUtils类】

代码语言:javascript
复制
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:

代码语言:javascript
复制
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】:

代码语言:javascript
复制
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里声明和注册权限。

代码语言:javascript
复制
<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" /  
代码语言:javascript
复制
<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  

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档