转自:http://www.hzhike.com/School/2011/201106/20110609222132.html

 

 

经过简单的google/baidu后,发现android没有现成的API去拒接电话。android可以通过注册BroadcastReceiver 截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。

  但是,电话呼入则没有类似的机制。不过,综合网上的一些资料,通过以下大体的步骤,则可以实现拒接电话:

  1、注册broadcast receiver,监视手机状态:

  Java代码

  < receiver android:name=".PhoneBroadcastReceiver">

  < intent-filter>

  < action android:name="android.intent.action.PHONE_STATE" />

  < /intent-filter>

  < /receiver>

  < receiver android:name=".PhoneBroadcastReceiver">

  < intent-filter>

  < action android:name="android.intent.action.PHONE_STATE" />

  < /intent-filter>

  < /receiver>

  当手机接收到电话时,则会触发该broadcast receiver。

  2、最重要的,就是取得可以控制电话的API。这些API貌似是android内部的接口,并未暴露。具体方式参见该帖子:http://topic.csdn.net/u/20091226/00/09e2979b-7c8c-4991-856d- 586a278875c0.html

  使用时需要手动添加import:

  Java代码

  import com.android.internal.telephony.ITelephony;

  import com.android.internal.telephony.ITelephony;

  同样的方式,在stackoverflow上也有人大致地提了下:http://stackoverflow.com/questions/1083527/how-to-block-calls-in-android

  值得注意的是,使用这种方式拒接来电,broadcast receiver会被触发两次。第一次是收到来电,第二次则是由于调用endCall拒接了后触发。我们在处理自己的程序逻辑时,可以通过 ITelephony.getCallState来区分。该函数返回1表示来电,0表示拒接来电。

  最后,这个方法有时候依然会出现系统接听电话的界面,并且,通话记录里也会有拒接电话的记录。这个原因大概也是系统底层在处理这块逻辑时,系统逻辑和通知broadcast receiver的存在先后顺序。这篇文章中分析了部分源码,也算是提个醒。

更多相关文章

  1. Android任务栈TaskStack
  2. Android(安卓)教你如何通过 LocationManager 获取得到当前位置坐
  3. Android(安卓)左右侧滑组件
  4. Android手势监听类GestureDetector
  5. Android(安卓)SearchView详细使用
  6. android,view的执行过程onDraw、onSizeChanged,onFinishInflate
  7. GestureDetector 和SimpleOnGestureListener的使用和解释
  8. android本地定时通知
  9. onRetainNonConfigurationInstance和getLastNonConfigurationIns

随机推荐

  1. Android中使用加速度传感器
  2. mono for android 第四课--提示框
  3. 视频教程-TCP/IP/UDP Socket通讯开发实战
  4. Android使用setCustomTitle()方法自定义
  5. android 加载网络图片 SkImageDecoder::F
  6. 一起来学Android(安卓)Studio:(三)导入项目
  7. 在Eclipse中导入新浪微博SDK
  8. Android(安卓)Content Provider的应用
  9. Android语录
  10. 关于android系统Binder机制解析