1. 程式人生 > >android 來電接聽和結束通話 支援目前所有版本

android 來電接聽和結束通話 支援目前所有版本

 ////////////////////////////////////結束通話電話///////////////////////////////////////
    try {
getITelephony(telmanager).endCall();
} catch (RemoteException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
    //防止電話沒有結束通話
    try {
getITelephony(telmanager).endCall();
} catch (RemoteException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
  

    /////////////////////////////////////////////////接聽電話///////////////////////////////////////////////////

 public void answerRingingCall(Context context,TelephonyManager telmanager) {  
        if (android.os.Build.VERSION.SDK_INT >=10 ) {  
            answerRingingCallWithBroadcast(context,telmanager);  
        } else {  
            answerRingingCallWithReflect(context,telmanager);  
        }  
    } 
    
    private ITelephony getITelephony(TelephonyManager telMgr) throws Exception {
Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod(
"getITelephony");
getITelephonyMethod.setAccessible(true);
return (ITelephony) getITelephonyMethod.invoke(telMgr);
}
      
    /**
     * android 2.3之前的系統可以使用反射接聽電話。
     * @param context
     */  
    private void answerRingingCallWithReflect(Context context,TelephonyManager telmanager) {  
    try {
getITelephony(telmanager).answerRingingCall();
} catch (RemoteException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
    }  
      
    /**
     * 偽造一個有線耳機插入,並按接聽鍵的廣播,讓系統開始接聽電話。
     * @param context,telmanager
     */  
    private void answerRingingCallWithBroadcast(Context context,TelephonyManager telmanager){  
        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);  
        //判斷是否插上了耳機  
        if (! audioManager.isWiredHeadsetOn()) { 
        if(android.os.Build.VERSION.SDK_INT >=15 ){
                Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);  
                KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);  
                meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);  
                context.sendOrderedBroadcast(meidaButtonIntent, null);  
        }else{
        Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);  
                localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);  
                localIntent1.putExtra("state", 1);  
                localIntent1.putExtra("microphone", 1);  
                localIntent1.putExtra("name", "Headset");  
                context.sendOrderedBroadcast(localIntent1,  "android.permission.CALL_PRIVILEGED");  
                
                Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON);  
                KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN,   KeyEvent.KEYCODE_HEADSETHOOK);  
                localIntent2.putExtra(Intent.EXTRA_KEY_EVENT,   localKeyEvent1);  
                context. sendOrderedBroadcast(localIntent2,  "android.permission.CALL_PRIVILEGED"); 
                
                Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON);  
                KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP,  KeyEvent.KEYCODE_HEADSETHOOK);  
                localIntent3.putExtra(Intent.EXTRA_KEY_EVENT,  localKeyEvent2);  
                context.sendOrderedBroadcast(localIntent3,   "android.permission.CALL_PRIVILEGED");  
                
                Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG);  
                localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);  
                localIntent4.putExtra("state", 0);  
                localIntent4.putExtra("microphone", 1);  
                localIntent4.putExtra("name", "Headset");  
                context.sendOrderedBroadcast(localIntent4, "android.permission.CALL_PRIVILEGED");
        }
              
        } else {  
            Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);  
            KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);  
            meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);  
            context.sendOrderedBroadcast(meidaButtonIntent, null);  
        }  
    } 

相關推薦

android 來電接聽結束通話 支援目前所有版本

 ////////////////////////////////////結束通話電話///////////////////////////////////////     try {getITelephony(telmanager).endCall();} catch (

Android自動接聽結束通話電話實現原理

轉自:http://bbs.51cto.com/thread-1078059-1.html 一  前言 這兩天要研究類似白名單黑名單以及手勢自動接聽的一些功能,所以呢,自然而然的涉及到怎麼自動接聽/結束通話電話的功能了。 對於自動接聽這一塊,android4.1

android 接聽結束通話實現方式

注意:android2.3版本及以上不支援下面的自動接聽方法。 (會拋異常:java.lang.SecurityException: Neither user xxxxx nor current process hasandroid.permission.MODIFY_PHONE_STATE.)

Android通過程式接聽或者結束通話電話

這篇文章教你如何幫助使用者自動接聽或者結束通話來電。當然並不是我原創的程式碼,我只不過是把stackoverflow上的一些程式碼整合了一下,做個程式碼的二傳手。 原始碼 AcceptOrRejectCallDemo 原始碼中用了MVP的模式,只是最簡

Android 藍芽開發(八)hfp接聽結束通話電話

本文已授權微信公眾號 fanfan程式媛 獨家釋出 掃一掃文章底部的二維碼或在微信搜尋 fanfan程式媛 即可關注 繼續研究hfp相關功能。藍芽耳機可以控制手機接聽、拒接、結束通話電話,撥打電話等功能。本文主要分析下起這些操作的大致流程。 在

Android撥打、接聽結束通話電話操作

Android2.3之前的系統可以通過反射機制呼叫ITelephone的方法來結束通話電話,因為Android2.3以後增加了對permission  android.permission.MODIFY_PHONE_STATE 的限制,之前的反射的方法不能用了,我們可以通過

java程式碼設定手機來電黑名單自動結束通話

今天講的是電話的黑名單自動結束通話的功能,所以現在跟著我的步驟來吧! 一、首先切換到project區間去,在main的資料夾裡面創一個aidl資料夾,把官網中下的兩個資料夾cope到這個aidl資料夾裡面去,再重新編譯兩次,第一次會報錯,不用管,再編譯一次就這可以,編譯兩次

js 從開始結束時間得到中間所有

    今天在論壇中看到一個帖子,給定輸入的字元型日期和結束的字元型日期,計算中間間隔的每一天的日期。正好專案不忙,就動手寫了一下,記錄下來吧。     原問題 var start_time 

Android 9 功能 API(二)-----------顯示屏缺口支援(劉海屏或凹凸屏)

詳細的適配方案,大家可以看我之前的文章: https://blog.csdn.net/wypeng2010/article/details/81019361     Android 9 支援最新的全面屏,其中包含為攝像頭和揚聲器預留空間的螢幕缺口。 通過 

Android圖片選擇器,仿微信的圖片選擇器的樣式效果。支援圖片預覽圖片切換

Android圖片選擇器,仿微信的圖片選擇器的樣式和效果。支援圖片的單選、限數量的多選和不限數量的多選。支援圖片預覽和圖片資料夾的切換。支援圖片單選並剪裁。先上效果圖:1、引入依賴在Project的build.gradle在新增以下程式碼allprojects { repositories {

來電攔截、來電結束通話,通過反射實現一鍵結束通話

最近在做這個功能,經過各位資料查詢,得出結論: 系統並沒有提供我們開發者去結束通話電話的介面 於是軟的不行硬的來,通過反射實現功能。 1、首先,在專案src\main資料夾下建立一個aidl資料夾; 2、在aidl建立一個包路徑為com.android.internal.t

android結束通話電話

//結束通話電話,需要呼叫系統底層的方法,要用哪個到反射拿底層方法 public void endcall(){ //載入serviceManager的位元組碼 Class clazz=CallSmsSafeService.clas

android使用webview上傳檔案(支援相簿拍照)

最近需要做一個專案,需要呼叫伺服器段的一些網頁來選擇檔案,剛開始還挺糾結的,不知從何下手,網上大致預覽了大神們走過的路,他們傳統的方式都是使用一下程式碼: publicvoid openFileChooser(ValueCallback<Uri> uploa

如何在Android的ListView中構建CheckBoxRadioButton列表(支援單選多選的投票專案示例)

引言 我們在android的APP開發中有時候會碰到提供一個選項列表供使用者選擇的需求,如在投票型別的專案中,我們提供一些主題給使用者選擇,每個主題有若干選項,使用者對這些主題的選項進行選擇,然後提交。 本文以一個支援單選和多選投票專案為例,演示了在一個ListView中如何構建CheckBox列表和Ra

利用JAVA反射機制訪問ITelephony隱藏介面(android程式中結束通話電話)

這兩天研究如何利用程式結束通話電話。發現在Android1.0的時候Phone中提供了提供了endCall方法,而1.5以後這個方法被設定為私有了。如此有了如下研究: /** * 利用JAVA反射機制呼叫ITelephony的endCall()結束通話。 */

寫了個html5播放視訊的video控制元件,只支援mp43gp(androidios預設支援的格式就寫了這個)

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head>     <meta http-equiv="Content-Type" content="text

內容觀察者 ContentObserver 監聽簡訊、通話記錄資料庫 結束通話來電

Activity publicclass MainActivity extends ListActivity {    private TextView tv_info;    private SMSContentObserver sms

Android : 執行緒的結束,掛起恢復(上)

實踐證明,上述情況下,建立的執行緒並不會自動銷燬,而是仍然在後臺默默無聞地執行,直到自行結束。Android的這種設計是無可厚非的。從理論上來解釋,應用的最小執行單位是執行緒,最小資源單位是程序,一個程序可以包含多個執行緒,而多個執行緒共享同一個所屬程序的資源。因此,個人理解Android的應用其實就是一個程

android使用webview上傳檔案(支援相簿拍照),支援最高6.0安卓系統(改進版)

首先學習 http://blog.csdn.net/woshinia/article/details/19030437 對input file的支援1.注意 mUploadMessage.onReceiveValue(Uri.parse("")); 必須得到呼叫,無論使用者是否選了圖,否則會出現再點選不響應

Android 實現音樂剪下功能 可以選擇起始點結束點 也可以同時拖動塊級元素

先看一下最終的效果使用者可以拖動兩邊來改變要擷取音樂的長度,也可以直接拖紅線來改變要擷取音樂的位置唯一的難點就是要計算出當前選擇了多少秒,還有拖動時候的操作,我是直接建立的佈局元素,通過onlayout()方法來改變控制元件的位置,廢話不多說,直接上部分原始碼之前上傳的程式碼