android实现接通和挂断电话

本文实例为大家分享了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里声明和注册权限。

<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" /> 
<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> 

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

(0)

相关推荐

  • Android如何帮助用户自动接听或者挂断来电

    这篇文章教你如何帮助用户自动接听或者挂断来电.当然并不是我原创的代码,我只不过是把stackoverflow上的一些代码整合了一下,做个代码的二传手. 源码 AcceptOrRejectCallDemo 源码中用了MVP的模式,只是最简单的使用,如果不熟悉的话刚好可以学学,逻辑部分在IncomingPresenter类中. 首先需要监听来电的广播 在AndroidManifest文件中添加: <receiver android:name=".incomingcall.PhoneListen

  • Android 实现手机接通电话后振动提示的功能

    有些手机在电话接通后会有振动提示,这有个好处就是可以等到接通后再放到耳边接听,减少辐射.本文就讲讲如何在Android手机中实现这种接通电话后的振动提示功能,这里主要针对拨出的电话.      Android SDK提供的通话状态 很明显,要在电话接通的时候产生振动提示,首先需要知道电话在何时被接通.而Android SDK并没有给出直接读取这种状态的方法.下面是Android SDK的电话服务类TelephonyManager提供的三种电话状态: CALL_STATE_IDLE        

  • android 添加按(power键)电源键结束通话(挂断电话)

    首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中. 我主要是在原生源码中添加这一功能,主要用于学习....先看一张图:  看到那个按电源键挂断电话吧,那就是我所添加的,本来原生源码中是没有这一栏的..... 大概思路: 首先我先添加这一个checkboxPreference,然后将是否选择这一功能的值(0和1)存到data/data/com.android.providers.settings /databases/setting

  • android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.server; import java.lang.reflect.Method; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; impor

  • Android开发四大组件之实现电话拦截和电话录音

    一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断. 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二.加入AIDL文件 Android没有对外

  • Android编程之利用服务实现电话监听的方法

    本文实例讲述了Android编程之利用服务实现电话监听的方法.分享给大家供大家参考,具体如下: 1. 启动模拟器,部署应用 2. 利用模拟器控制器发送短信启动服务(查看日志输出判断是否成功) 3. 向模拟器拨打电话,并接听,挂断电话后,利用文件管理查看对应的cache目录或者sdcard中生成了3gp文件,并将其复制到pc中播放以验证. 清单设置(一个receiver,一个service,若干权限) <uses-permission android:name="android.permis

  • Android广播接实现监听电话状态(电话的状态,拦截)

    首先我们来理解下监听器的机制. Android的事件处理机制有两种:监听和回调. A基于监听的事件处理 主要涉及三类对象:EventSource(事件源),Event(事件),EventListener(事件监听器) 监听机制处理事件的流程图如下(委派式:Delegation): 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS&q

  • Django项目后台不挂断运行的方法

    方法一: 1.进入项目目录下,运行下面程序: nohup python manage.py runserver 0.0.0.0:5008 & nohup(no hang up)用途:不挂断的运行命令 &用途:在后台运行 nohup /root/start.sh & 在shell中回车后提示: [~]$ appending output to nohup.out 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用. 注意:在nohup执行成功后直接点

  • android音乐播放器监听电话状态实现代码

    如下代码是监听电话的状态,代码简单不做介绍直接看代码: 复制代码 代码如下: private boolean mResumeAfterCall = false; private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {  @Override  public void onCallStateChanged(int state, String incomingNumber) {   if (state ==

  • android连续拖动导致挂起的解决方法

    当我保持对连续将对象拖有时在移动后 5 6 拖/滴,看到有时不获取对象还原不回来,我不能用于以后. 基本上我有对两个对象组的 canvas 在 time 可以有最大的两个图像不是更多比,也看到图像 为什么会发生呢,我们如何防止? (function () { var canvas = new fabric.Canvas('canvas'); var canvas_el = document.getElementById('canvas'); var canvas1 = new fabric.Ca

  • Android 实现电话拦截及拦截提示音功能的开发

    本文所讲的内容是在Android系统中如何写程序进行电话拦截,并发出拦截提示音提醒用户,可以说此功能还是比较实用的.        1.电话拦截 这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现.        2.拦截后提示忙音/空号/已关机/已停机 这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 http://baike.baidu.com/view/206402.html?fromTaglist. 在本文中我们会用到"遇忙转移&qu

随机推荐