Android手機安全軟件之設置電話攔截返回音淺析

Android手機安全軟件之設置電話攔截返回音淺析

相信很多Android手機用戶都用過手機安全軟件的“電話攔截”功能,不管您用的是360安全衛士、騰訊手機管家,還是金山毒霸,它們的共同特點就是您在設置來電攔截黑名單或開啓/關閉來電等待時,界面並不友好(如下圖所示),比如:會有撥號界面彈出再消失,或者手機會撥打一個號碼,需要用戶手動掛斷或直到連接自動掛斷。

第三方應用(即使具有root權限)在完成這兩個功能時,無法避免撥號界面的出現。原因是這兩個功能需要利用SIM卡呼叫轉移、呼叫等待功能,撥打某個特定號碼,所以設置該功能時會出現撥號界面。

GSM爲例,現在的實現中:

來電攔截返回音是通過撥以下特定號碼實現的:

        String BUSY_NUMBER = "%23%2367%23";

        String EMPTY_NUMBER = "**67*13800000000%23";

        String POWEROFF_NUMBER = "**67*13810538911%23";

        String OUT_OF_SERVICE_NUMBER = "**67*13701110216%23";

呼叫等待開啓和關閉是通過撥以下號碼實現的:

        String GSM_CALL_WAIT_OPEN = "*43%23";

        String GSM_CALL_WAIT_CLOSE = "%2343%23";

所以通過一個第三方應用(即使它有root權限)去設置來電攔截返回音或開啓/關閉呼叫等待時,就會出現撥號界面,用戶體驗不好。

 

一、原理分析

1Android去電流程

下圖右邊藍色框中粗略的給出了Android撥打電話的流程,其中藍色填充的部分表示的Appphone應用,粉色填充部分表示的是framework層。從圖中可看出,當撥出電話流程走到CallControllerplaceCall()後,會做兩件事情:1)call CallManagerdial()方法撥打電話;2),不管撥打成功與否,都會將InCallScreen(撥號界面)展示到前端。當通過第三方應用設置來電攔截返回音時,根據來電攔截原理,會撥打某個特殊的號碼,因此通過正常的Outgoing call流程一定不可避免撥打界面的出現。

二、改進和優化

我們從系統入手,徹底解決這個不友好的界面。完整的撥號流程會從app->framework層,撥號界面的出現是在app層,因此我們避開撥號流程中app層的流程,通過我們自己的service直接調用framework層的撥號方法,從而避免了撥號界面的出現,消除了不好的用戶體驗。

i) init.rc中添加一個service(上圖左邊Service綠色方框所示),並授予它root權限。該service起來之後,等待client端的請求。並對client端暴露了一套SDK API接口(上圖左邊SDK API綠色方框所示),app應用通過調用這套API接口,設置、查詢來電攔截返回音。我們提供的SDK 接口有:

public boolean setReturnCause(int reason, int simId);//設置來電攔截返回音

public String getCallForwardSetting(int reason, int simId);//查詢呼叫轉移號碼(即返回音)

public boolean setCallWait(int status, int simId);//設置開啓/關閉呼叫等待

ii) PhoneInterfaceManager中新增一個方法setReturnCause()(如上圖左邊綠色部分所示),當用戶設置來電攔截返回音或呼叫等待時,返回音類型或呼叫等待待設類型會傳遞給telephony service,並通過PhoneInterfaceManager中的方法setReturnCause()(來電攔截和呼叫等待原理相同,因此走的同一套流程)去直接調用framework層的dial()方法,從而避免彈出InCallScreen

從以上的分析可看出,針對設置來電返回音和開啓/關閉呼叫等待功能會彈出撥號界面這一問題,第三方應用,不管它有沒有root權限,都無法避免撥號界面的出現。而我們從系統入手,將撥號流程“攔腰”截斷,從底層“靜默”進行撥號流程,避免了上層的撥號界面的彈出。

 

三、存在問題

1、由於在“通話設置”->“來電轉接”->“佔線時轉接”中可查詢並修改返回音的狀態,因此,對返回音設置途徑並不唯一。用戶可手動進入通話設置中設置,也可通過其他手機安全軟件設置,又或者通過我們提供的API設置。這會就造成來電攔截返回音以最後一次設置爲準(不管是通過哪種途徑設置)。

2、正常拒接電話操作(比如有電話打入,此時用戶直接掛斷電話),android系統中默認的是用戶忙(所以您打電話出去,接收者掛斷您的電話,您會聽到“您撥打的用戶忙”)。而由於忙時轉接已被設置,所以正常的來電被掛斷就會走忙時轉接流程,因此返回音也會相應的改成用戶已經設置的返回音了。所以也許有的用戶有過這樣的經歷:您撥打電話給某人,電話通了之後,返回“您撥打的用戶已停機”等,可能是由於他設置了來電攔截黑名單時選擇的返回音是“已關機”,從而修改了忙時轉接的號碼。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章