Android电话状态处理(区分呼入呼出)


使用广播和监听

需加入权限:

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

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

注册广播:

       <receiver android:name=".receiver.PhoneStateReceiver" 
           android:label="phoneState">
           <!-- 2147483647为最大的整数,这里代表优先级最高 -->
           <intent-filter android:priority="2147483647">
                <action android:name="android.intent.action.PHONE_STATE"/>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter> 
       </receiver>

处理广播代码:

package com.xxx.receiver;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

/**
* 接收电话状态改变广播

*/
public class PhoneStateReceiver extends BroadcastReceiver
{
   /** TAG */
   private static final String TAG = "PhoneStateReceiver";

   /** 避免多次注册电话状态监听标记 */
   private static boolean isListen = false;

   /** 当前操作电话号码 */
   private static String currentNumber = null;

   /** 区分呼入呼出标记 */
   private static boolean isOuting = false;// 是否是呼出电话

   @Override
   public void onReceive(Context context, Intent intent)
   {
       if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
       {
           // 呼出
           isOuting = true;
           String phonenumber = getResultData();// 被呼叫的电话号码

           // 更新电话号码
           if (null != phonenumber && !"".equals(phonenumber))
           {
               currentNumber = phonenumber;
           }
           Log.i(TAG, "呼出:p=" + phonenumber + ";c=" + currentNumber);
       } else
       {
           // 监听电话状态改变
           if (!isListen)
           {
               TelephonyManager tm = (TelephonyManager) context
                       .getSystemService(Service.TELEPHONY_SERVICE);
               tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
           }
       }
   }

   /**
    * 电话监听
    */
   static PhoneStateListener listener = new PhoneStateListener() {

       @Override
       public void onCallStateChanged(int state, String incomingNumber)
       {

           // Log.i(TAG, "Phone value. s=" + state + ";p=" + incomingNumber);

           isListen = true;// 已成功添加监听
           // 更新电话号码
           if (null != incomingNumber && !"".equals(incomingNumber))
           {
               currentNumber = incomingNumber;
           }
           switch (state)
           {
           case TelephonyManager.CALL_STATE_IDLE:
               Log.i(TAG, "挂断:p=" + incomingNumber + ";c=" + currentNumber
                       + ";s=" + state);
               break;
           case TelephonyManager.CALL_STATE_OFFHOOK:
               Log.i(TAG, "接听:p=" + incomingNumber + ";c=" + currentNumber
                       + ";s=" + state);

               // 处理事务
               if (isOuting)
               {
                   // 处理呼出事务
                   Log.i(TAG, ">>>正在处理呼出...");
               } else
               {
                   // 处理呼入事务
                   Log.i(TAG, "<<<正在处理呼入...");
               }

               break;
           case TelephonyManager.CALL_STATE_RINGING:
               Log.i(TAG, "呼入:p=" + incomingNumber + ";c=" + currentNumber
                       + ";s=" + state);
               isOuting = false;
               break;
           }
       }

   };

}

xxoo

http://www.hiputto.com/post/2013-10-11/android-listen-phone-state


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值