Android 實現直接拒接來電

來源:互聯網
上載者:User

轉自: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的存在先後順序。這篇文章中分析了部分源碼,也算是提個醒。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.