Android来电监听和去电监听实现代码

我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开

1、监听来电去电有什么用?

2、怎么监听,来电去电监听方式一样吗?

3、实战,有什么需要特别注意地方?

监听来电去电能干什么

1、能够对监听到的电话做个标识,告诉用户这个电话是诈骗、推销、广告什么的

2、能够针对那些特殊的电话进行自动挂断,避免打扰到用户

来电去电的监听方式(不一样的方式)

1、来电监听(PhoneStateListener)

  来电监听是使用PhoneStateListener类,使用方式是,将PhoneStateListener对象(一般是自己继承PhoneStateListener类完成一些封装)注册到系统电话管理服务中去(TelephonyManager)

  然后通过PhoneStateListener的回调方法onCallStateChanged(int state, String incomingNumber) 实现来电的监听 (详细实现可以参考后面给出的拓展阅读部分)

  注册监听

// phoneServiceName是服务名,一般是 "phone" --> Context.TELEPHONY_SERVICE
TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(phoneServiceName);
if(telephonyManager != null) {
  try {
    // 注册来电监听
    telephonyManager.listen(mTelephonyListener, PhoneStateListener.LISTEN_CALL_STATE);
  } catch(Exception e) {
    // 异常捕捉
  }
}

  PhoneStateListener的onCallStateChanged方法监听来电状态

@Override
public void onCallStateChanged(int state, String incomingNumber) {
  switch (state) {
    case TelephonyManager.CALL_STATE_IDLE:
      // 电话挂断
      break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
      // 来电响铃
      break;
    case TelephonyManager.CALL_STATE_RINGING:
      // 来电接通
      break;
    default:
      break;
  }
}

  三种状态源码解释

/** Device call state: No activity. */
public static final int CALL_STATE_IDLE = 0;  // 电话挂断
/** Device call state: Ringing. A new call arrived and is
 * ringing or waiting. In the latter case, another call is
 * already active. */
public static final int CALL_STATE_RINGING = 1;  // 来电响铃
/** Device call state: Off-hook. At least one call exists
 * that is dialing, active, or on hold, and no calls are ringing
 * or waiting. */
public static final int CALL_STATE_OFFHOOK = 2;  // 来电接通

2、去电监听(通过广播来实现)

// OutgoingCallListener继承一个BroadcastReceiver
<receiver android:name="com.test.OutgoingCallListener" >
  <intent-filter>
    <action android:name="android.intent.action.PHONE_STATE"/>
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
  </intent-filter>
</receiver>

实战,有什么需要特别注意地方

1、双卡双待的手机怎么获取

  对于双卡手机,每张卡都对应一个Service和一个PhoneStateListener,需要给每个服务注册自己的PhoneStateListener,服务的名称还会有点变化,厂商可能会修改

public ArrayList<String> getMultSimCardInfo() {
  // 获取双卡的信息,这个也是经验尝试出来的,不知道其他厂商有什么坑
  ArrayList<String> phoneServerList = new ArrayList<String>();
  for(int i = 1; i < 3; i++) {
    try {
      String phoneServiceName;
      if (MiuiUtils.isMiuiV6()) {
        phoneServiceName = "phone." + String.valueOf(i-1);
      } else {
        phoneServiceName = "phone" + String.valueOf(i);
      }
      // 尝试获取服务看是否能获取到
      IBinder iBinder = ServiceManager.getService(phoneServiceName);
      if(iBinder == null) continue;
      ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
      if(iTelephony == null) continue;
      phoneServerList.add(phoneServiceName);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
  // 这个是默认的
  phoneServerList.add(Context.TELEPHONY_SERVICE);
  return phoneServerList;
}

2、挂断电话

  挂断电话使用系统服务提供的接口去挂断,但是挂断电话是个并不能保证成功的方法,所以会有多种方式挂断同时使用,下面提供

public boolean endCall() {
  boolean callSuccess = false;
  ITelephony telephonyService = getTelephonyService();
  try {
    if (telephonyService != null) {
      callSuccess = telephonyService.endCall();
    }
  } catch (RemoteException e) {
    e.printStackTrace();
  } catch (Exception e){
    e.printStackTrace();
  }
  if (callSuccess == false) {
    Executor eS = Executors.newSingleThreadExecutor();
    eS.execute(new Runnable() {
      @Override
      public void run() {
        disconnectCall();
      }
    });
    callSuccess = true;
  }
  return callSuccess;
}
private boolean disconnectCall() {
  Runtime runtime = Runtime.getRuntime();
  try {
    runtime.exec("service call phone 5 \n");
  } catch (Exception exc) {
    exc.printStackTrace();
    return false;
  }
  return true;
}
// 使用endCall挂断不了,再使用killCall反射调用再挂一次
public static boolean killCall(Context context) {
  try {
    // Get the boring old TelephonyManager
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    // Get the getITelephony() method
       Class classTelephony = Class.forName(telephonyManager.getClass().getName());
    Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony");
    // Ignore that the method is supposed to be private
      methodGetITelephony.setAccessible(true);
    // Invoke getITelephony() to get the ITelephony interface
      Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);
    // Get the endCall method from ITelephony
      Class telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
    Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");
    // Invoke endCall()
    methodEndCall.invoke(telephonyInterface);
  } catch (Exception ex) { // Many things can go wrong with reflection calls
    return false;
  }
  return true;
}

3、挂断电话需要权限

<uses-permission android:name="android.permission.CALL_PHONE" />

以上所述是小编给大家介绍的Android来电监听和去电监听,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • android实现来电静音示例(监听来电)

    复制代码 代码如下: private static int previousMuteMode = -1; /** * 来电静音 *  * @param context */private void toggleRingerMute(Context context){    AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);    if (previousMuteMode == -1) 

  • Android监听系统来电并弹出提示窗口

    1.问题 项目中有自己企业的通讯录,但是在应用中拨打公司通讯录的联系人,由于手机通讯录中没有相应的信息,只显示一串电话号 2 .目的 监听系统来电,获取到电话号码,通过调用接口,查询出来相应电话号码的详细信息,并弹出系统悬浮框,给用户提示. 3.实现 首先 注册广播监听系统来电.监听系统来电需要.注册相应的权限 代码地址:https://github.com/sdsjk/phone_alert.git <uses-permission android:name="android.permi

  • android 电话状态监听(来电和去电)实现代码

    实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener. TelephonseManger提供了取得手机基本服务的信息的一种方式.因此应用程序可以使用TelephonyManager来探测手机基本服务的情况.应用程序可以注册listener来监听电话状态的改变.我们不能对TelephonyManager进行实例化,只能通过获取服务的形式: Context.getSystemService(Context.TELEPHONY_SERVICE);

  • Android监听手机电话状态与发送邮件通知来电号码的方法(基于PhoneStateListene实现)

    本文实例讲述了Android监听手机电话状态与发送邮件通知来电号码的方法.分享给大家供大家参考,具体如下: 在android中可以用PhoneStateListener来聆听手机电话状态(比如待机.通话中.响铃等).本例是通过它来监听手机电话状态,当手机来电时,通过邮件将来电号码发送到用户邮箱的例子.具体程序如下: import android.app.Activity; import android.content.Intent; import android.os.Bundle; impor

  • Android中监听未接来电的2种方法

    这里主要是总结一下如何监听有未接来电的问题   1.1 使用广播接收器 BrocastReceiver 实现思路 : 静态注册监听android.intent.action.PHONE_STATE 的广播接收器 当手机的状态改变后将会触发 onReceive. 手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音). 也就是说当你没有任何电话是,状态是 IDLE ,当接到电话时是 OFFHOOK ,电话结

  • Android监听来电和去电的实现方法

    本文实例讲述了Android监听来电和去电的实现方法.分享给大家供大家参考,具体如下: 要监听android打电话和接电话,只需下面2步骤 第一步,写一个Receiver继承自BroadcastReceiver import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import andr

  • Android来电监听和去电监听实现代码

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听来电去电能干什么 1.能够对监听到的电话做个标识,告诉用户这个电话是诈骗.推销.广告什么的 2.能够针对那些特殊的电话进行自动挂断,避免打扰到用户 来电去电的监听方式(不一样的方式) 1.来电监听(PhoneStateListener) 来电监听是使用PhoneStateListener类,使用方式

  • Android 监听WiFi的开关状态实现代码

    Android 监听WiFi的开关状态实现代码 WifiSwitch_Presenter 源码: package com.yiba.wifi.sdk.lib.presenter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net

  • Android编程实现音量按钮添加监听事件的方法

    本文实例讲述了Android编程实现音量按钮添加监听事件的方法.分享给大家供大家参考,具体如下: 很多Android应用都应用到音量按钮,比如翻页,调整音乐声音大小等,但是如果没有对音量按钮进行监听,则无法达到预期的效果.如下代码,就是监听Android手机的音量按钮,开发者可以在相应的位置添加自己需要实现的功能. @Override public boolean onKeyDown (int keyCode, KeyEvent event) { // 获取手机当前音量值 int i = get

  • Android ListView里控件添加监听方法的实例详解

    Android ListView里控件添加监听方法的实例详解 关于ListView,算是android中比较常见的控件,在ListView我们通常需要一个模板,这个模板指的不是住模块,而是配置显示在ListView里面的东西,今天做项目的时候发现想要添加一个ImageView监听方法,发现崩了,也许是好久没有动ListView竟然忘了不能直接在主UI的xml文件里面调用其他xml文件的控件,哪怕ListView用的是这个xml文件. [错误示范]: 直接调用ImageView这个控件是ListV

  • Android对EditTex的图片实现监听

    本文为大家分享了EditTex图片实现监听的方法,供大家参考,具体内容如下 第一个例子:对EditText右边的图片进行监听 获取EditText的最右边的x2坐标减去最右边图片的x1坐标点,当点击所在x坐标在于这2个x之间的时候就执行监听事件 final EditText editText = (EditText) findViewById(R.id.zsm); editText.setOnTouchListener(new OnTouchListener() { final int DRAW

  • Android 监听手机GPS打开状态实现代码

    Android 监听手机GPS打开状态实现代码 GPS_Presenter package com.yiba.core; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.location.LocationManager; /** *

  • Android监听手机短信的示例代码

    本文介绍了Android监听手机短信的示例代码,分享给大家,具体如下: 以下情况可能会导致短信拦截失败: 小米,360等品牌手机拦截短信,短信的优先级给了系统 用户禁用短信权限 手机连接电脑,被电脑端的手机助手类软件截获 手机内装有QQ通讯录之类的管理联系人,短信的应用,被截获. 前提--权限: <uses-permission android:name="android.permission.RECEIVE_SMS" > </uses-permission>

  • Android开发实现ListView部分布局监听的方法

    本文实例讲述了Android开发实现ListView部分布局监听的方法.分享给大家供大家参考,具体如下: android listview 部分布局监听,很多人会想,直接在适配器里面,拿到那个布局,添加点击事件就可以了,不过我会告诉你的是这时候position是错乱的,是无法根据用户点击的位置来对每个item进行相应的逻辑操作.  同事给我想到的一个办法是:给每个布局提前设置一个tag,也就是绑定对应需要设置的数据,在点击事件的时候,会有一个view,根据该view重新拿到这个tag,取得里面的

  • Android TextWatcher三个回调以及监听EditText的输入案例详解

    TextWatcher是一个监听字符变化的类.当我们调用EditText的addTextChangedListener(TextWatcher)方法之后,就可以监听EditText的输入了. 在new出一个TextWatcher之后,我们需要实现三个抽象方法: beforeTextChanged onTextChanged afterTextChanged 看下beforeTextChanged的注释: This method is called to notify you that, with

  • Android开发手册Chip监听及ChipGroup监听

    目录 Chip监听 ChipGroup监听 实例 效果展示 Chip监听 选中状态的监听:setOnCheckedChangeListener,该监听只有设置了checkable 属性为true或者使用了[filter/entry/choice]这三个style主题的时候才生效. 点击事件的监听:setOnClickListener 关闭按钮被点击的监听:setOnCloseIconClickListener Java myChip.setOnCloseIconClickListener(Vie

随机推荐