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

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<receiver android:name="com.example.phonestatedemo.receiver.PhoneStateReceiver">
   <intent-filter >
      <action android:name="android.intent.action.PHONE_STATE"/>
   </intent-filter>
 </receiver> 

 

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast; 

public class PhoneStateReceiver extends BroadcastReceiver { 

  private static int lastCallState = TelephonyManager.CALL_STATE_IDLE; 

  @Override
  public void onReceive(Context arg0, Intent arg1) {
    String action = arg1.getAction();
    Log.d("PhoneStateReceiver", action );
    TelephonyManager telephonyManager = (TelephonyManager) arg0
        .getSystemService(Context.TELEPHONY_SERVICE);
    int currentCallState = telephonyManager.getCallState();
    Log.d("PhoneStateReceiver", "currentCallState=" + currentCallState );
    if (currentCallState == TelephonyManager.CALL_STATE_IDLE) {// 空闲
      //TODO
    } else if (currentCallState == TelephonyManager.CALL_STATE_RINGING) {// 响铃
      //TODO
    } else if (currentCallState == TelephonyManager.CALL_STATE_OFFHOOK) {// 接听
      //TODO
    }
    if(lastCallState == TelephonyManager.CALL_STATE_RINGING &&
          currentCallState == TelephonyManager.CALL_STATE_IDLE){
      Toast.makeText(arg0, "有未接来电", 1).show();
    } 

    lastCallState = currentCallState; 

  } 

}
 

1.2  使用 PhoneStateListener
实现思路 :
继承PhoneStateListener后,当手机的状态改变后将会触发onCallStateChanged.手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音).
也就是说当你没有任何电话是,状态是 IDLE ,当接到电话时是 OFFHOOK ,电话结束后返回 IDLE 状态。
记录上一次的手机状态,如果的手机现在的空闲,上次的状态响铃中的话,就可以判断是未接来电.
 
不足:现在的处理不能判断出是用户是否主动不接电话.

TelephonyManager telephonyManager = (TelephonyManager) this
        .getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.listen(new CallStateListener(this),
        PhoneStateListener.LISTEN_CALL_STATE); 

package com.example.phonestatedemo.listener; 

import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast; 

public class CallStateListener extends PhoneStateListener {
  private static int lastetState = TelephonyManager.CALL_STATE_IDLE; // 最后的状态
  private Context context; 

  public CallStateListener(Context context) {
    this.context = context; 

  } 

  @Override
  public void onCallStateChanged(int state, String incomingNumber) {
    // TODO Auto-generated method stub
    super.onCallStateChanged(state, incomingNumber);
    Log.d("CallStateListener", "onCallStateChanged state=" + state );
    // 如果当前状态为空闲,上次状态为响铃中的话,则破觚为认为是未接来电
    if (lastetState == TelephonyManager.CALL_STATE_RINGING
        && state == TelephonyManager.CALL_STATE_IDLE) {
      //TODO
      Toast.makeText(this.context, "CallStateListener 有未接来电", 1).show();
    } 

    lastetState = state; 

  } 

}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
监听未接来电
android 监听未接来电、android 未接来电通知、android 获取未接来电、android添加未接来电、android未接来电,以便于您获取更多的相关知识。

时间: 2024-08-22 14:49:53

Android中监听未接来电的2种方法_Android的相关文章

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

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

Android中使用Gson解析JSON数据的两种方法_Android

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

Android 中无法取消标题栏的问题小结(两种方法)_Android

我们都知道取消标题栏有两种方式,一种是在Java代码中取消,另一种通过设置styles.xml文件中的Theme即可:如下图: 第一种: 第二种: 但是运行在Android 5.0 之后发现已经无法达到想要的效果,这时候可以怎么处理呢?只需要更改一行代码即可. 我们可以通过更改styles.xml文件中的Theme继承即可实现目的,如下图:

Android监听输入法弹窗和关闭的实现方法_Android

用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可靠的实现方式. 演示效果视频地址 首先在AndroidManifest中配置 android:windowSoftInputMode="adjustResize" 这样每次输入法弹出和关闭都会重新计算高度实现把布局顶上去的效果 然后我们要自定义一个布局,监听布局大小变化 public class CheckSoftInputLayout exten

Android中EditText显示明文与密码的两种方式_Android

效果图如下所述: 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pa

Android中使用CircleImageView和Cardview制作圆形头像的方法_Android

圆形头像在我们的日常使用的app中很常见,因为圆形的头像比较美观. 使用圆形图片的方法可能有我们直接将图片裁剪成圆形再在app中使用,还有就是使用自定义View对我们设置的任何图片自动裁剪成圆形. 效果图: 这里使用github上CircleImageView github:https://github.com/hdodenhof/CircleImageView CardView顾名思义卡片式的View,CardView继承的是FrameLayout,所以摆放内部控件的时候需要注意一下 可以设置

Android中activity跳转按钮事件的四种写法_Android

具体实现代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 方法1. 采用实现OnClickListener接口的类 ((Button) findViewById(R.i

Android中Java根据文件头获取文件类型的方法_Android

本文实例讲述了Android中Java根据文件头获取文件类型的方法.分享给大家供大家参考,具体如下: 前面讲过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其实,获取文件类型最好的办法便是根据文件头信息来判断.下面贴出相关代码: public class FileType { public static final HashMap<String, Str

Android开发之子线程操作UI的几种方法_Android

 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如