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

关键代码:【PhoneUtils类】

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:

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】:

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. Android.mk 代码注释
  2. Android开发常用经典代码段集锦
  3. android的sd卡上创建目录不显示
  4. 《android常用的API接口调用》
  5. 【Android】如何使默认图库中获得的图像旋转成正确的方向
  6. android奇怪问题收集
  7. Android消息推送(广播机制)+通知
  8. Android之selector
  9. Android学习笔记Android必备开发工具之一命令行创建Git库

随机推荐

  1. Android make脚本简记
  2. Android(安卓)UI:筛选条的简单实现
  3. Android错误解决 Call requires API leve
  4. android登录tomcat服务器并查找数据库的
  5. android飞机游戏敌机移动路径
  6. Android最基本的异步网络请求框架
  7. Android(安卓)KitCat 4.4.2 ADB 官方所支
  8. Android系统添加自己写的工具
  9. Android中的Ninja简介
  10. android 项目R文件丢失解决办法