2013-05-22 52 views
9

我知道這已經被問了很多次,沒有答案,但我仍然希望有人終於解決了這個問題。在Android上檢測到撥出電話

問題:我有一個運行Android 2.3的無根設備。我需要創建一項服務:

  1. 撥打電話;
  2. 等待直到通話被應答;
  3. 呼叫應答後(超時)掛斷電話;

像許多人一樣,我得堅持#2。下面是該解決方案的不斷提出摘要:

  • 使用PhoneStateListener(最流行的):不工作,對於呼出它不能檢測我需要什麼。
  • 使用com.android.internal.telephony.CallManager及其方法如registerForPreciseCallStateChanged(例如,this one):不起作用,沒有電話註冊在其中,所以事件不會觸發。
  • 使用com.android.internal.telephony.PhoneFactory獲得com.android.internal.telephony.Phone實例(這是一切的關鍵):不工作,工廠沒有被初始化;嘗試使用makeDefaultPhones調用初始化它會導致安全異常(如here)。
  • 檢測傳出鈴聲(link):作者 - Dany Poplawec - 指出檢測鈴聲可能有助於解決問題,但沒有提供任何細節,所以我無法嘗試這種技術。

看起來一切都已經嘗試過,但仍可能有一個技巧,將節省我:)

+0

你收到這方面的任何解決方案? – Noundla

+0

唉,看起來除了修改Android操作系統本身之外,沒有什麼可以做的。 –

回答

0

我試圖讓這也並不能找到任何解決辦法呢。

找上了Android源代碼,我發現這些線路在〜/廚房/豆形軟糖/框架的/ opt /電話/ src目錄/ JAVA/COM /安卓/內部/電話/ Call.java

public enum State { 
    IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING; 

    public boolean isAlive() { 
     return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING); 
    } 

    public boolean isRinging() { 
     return this == INCOMING || this == WAITING; 
    } 

    public boolean isDialing() { 
     return this == DIALING || this == ALERTING; 
    } 
} 

我認爲一個人能知道,如果撥出電話有人接聽檢查ACTIVE狀態,但我不知道如何從一個應用程序中加入具有特定功能的這個像讀這個值,可能修改的框架:

public boolean isActive() { 
     return this == ACTIVE; 
    } 

這只是一個想法,但我不知道如何實現這一點,因爲顯然爲了從應用層訪問這個新功能,必須做其他修改。

如果你覺得這個可行或知道如何去做,幫助和反饋將非常感激。

0

在第三子彈的解決方案應該是可能的根設備,如果您按照Android INJECT_EVENTS permission

一步一步的說明,它是這樣的:

  1. 簽署與平臺證書的應用。這需要以下步驟:
    • 添加機器人:sharedUserId =「android.uid.phone」你apk's清單的清單標籤。
    • 添加機器人:過程=「com.android.phone」到清單的應用程序代碼。
    • 您可能需要爲清單添加一些額外權限,並且還需要更改項目的「Android Lint首選項」中的ProtectedPermission的嚴重性。
    • 得到{Android的源}的platform.pk8 + platform.x509.pem /建設/目標/產品/安全(我用藥粥4.4.4r1在https://android.googlesource.com/platform/build/+/android-4.4.4_r1/target/product/security/
    • 下載密鑰工具 - importkeypair從https://github.com/getfatday/keytool-importkeypair
    • 使用此腳本通過以下命令獲取平臺的密鑰存儲:keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform。我在cygwin上運行它,並對腳本稍作修改。
    • 註冊使用該密鑰庫的APK。
  2. 使用ADB安裝該應用程序作爲一個系統的應用程序:

    ADB根

    亞行重新裝入

    ADB推MyApp.apk /系統/應用

    ADB殼CHMOD 644 /systen/app/MyApp.apk

  3. 重新啓動設備。

我實際上已經嘗試了第二顆子彈中的解決方案,它對我來說也不起作用(在運行Kitkat的Galaxy S5上)。 第3項項目中的解決方案確實可行。無論程序包名稱如何,該應用程序都以com.android.phone的形式運行,因此如果要調試應用程序,則需要附加到該進程。

+0

那麼,根與許多事情是可能的。但是,我的一個關鍵要求是使用不具備root用戶權限的庫存設備。無論如何,感謝分享,可能有助於有一天:) –

+0

在Android的版本之前的4.1,你可以從你的應用程序中解析logcat的輸出對於大多數呼叫事件。這確實是一個骯髒的解決方案,但可以在非根目錄的設備上工作。不幸的是,在新的android版本中這是不可能的。 – JuanNoguera