2014-01-08 69 views
5

我正在開發能夠接聽電話的自定義電話應用程序。 使用此代碼處理來電 https://code.google.com/p/auto-answer/source/browse/trunk/src/com/everysoft/autoanswer/AutoAnswerIntentService.java專注於來電的Android-Telephony應用程序

不幸的是,我的應用程序失去了對來電的關注。

這是撥出電話 Android- Telephone app that keeps focus on outgoing & incoming phoneCall

什麼有關來電的部分解決方案?我如何在我的自定義應用程序中保持專注?

我猜這可能涉及到下載和修改源代碼,因爲只需訪問SDK即可輕鬆控制內置的電話應用程序。

+1

請在這裏發佈相關的代碼,而不僅僅是一個鏈接。 –

+0

整個源庫? –

+0

我發佈的鏈接有點不相關,因爲任何接聽電話(我嘗試過)只實現應用層的方法都會導致本地電話應用程序獲得焦點。因此,我對源代碼的調查@ https://android.googlesource.com –

回答

0

在manifest.xml文件中提及下面的廣播接收器。

<receiver android:name="com.example.incomingcall.IncomingCallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
</receiver> 

IncomingCallReceiver.java:

public class IncomingCallReceiver extends BroadcastReceiver{ 

     public void onReceive(Context context, Intent intent) { 
      Bundle extras = intent.getExtras(); 
      if (extras != null) { 
      String state = extras.getString(TelephonyManager.EXTRA_STATE); 
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      Thread thread = new Thread(){ 
      private int sleepTime = 400; 

     @Override 
     public void run() { 
     super.run(); 
     try { 
       int wait_Time = 0; 

       while (wait_Time < sleepTime) { 
        sleep(100); 
        wait_Time += 100; 
       } 
      }catch (Exception e) { 
       Toast.makeText(context, 
         "Error Occured Because:" + e.getMessage(), 
         Toast.LENGTH_SHORT).show(); 
      } 
      context.startActivity(new Intent(context,CustomActivity.class) 
        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
     } 
    }; 
    thread.run(); 

    } 
    } 
} 
} 
+0

謝謝,我會嘗試,但我已經用TelephonyManager嘗試了許多幾乎完全相同的基於狀態的解決方案,但它們沒有達到預期的效果。通話應答屏幕仍然可見。 Nexus 5運行KitKat。我幾乎100%肯定實際的AOSP必須被黑客入侵。 –

+0

其實「android.intent.action.NEW_OUTGOING_CALL」是有序廣播。因此,通過給意圖過濾器(具有最高優先級的廣播將首先觸發)給予最高優先級,我們可以啓動我們的應用程序。但是「android.intent.action.PHONE_STATE」是無序廣播。所以,優先級沒有用。所有人都會同時射擊。所以,我認爲這是不可能的來電。 – user543

1

由於您關於呼出呼叫所作的參考是可以接受的,則可以放置在活動來電屏幕它顯示後不久的前面。這樣做的困難在於呼叫狀態將變爲「RINGING」,然後是「OFFHOOK」,但是當廣播這些電話時,電話未顯示InCallScreen。

就像您引用的帖子一樣,該解決方案實際上並沒有將手機功能嵌入到應用程序中(例如用於網頁瀏覽的webview),而是在顯示後不久將活動放置在InCallScreen前面。

對於來電,則需要延遲推出的活動,像在這個帖子:

Android - Customised New Incoming Call Screen

您可以在點放任何東西在屏幕上,最困難的部分是確定的滯後以便它滿足您的需求(速度足夠慢,以便InCallScreen有機會啓動,但速度足夠快以至於破壞性最小)。除此之外,即使擴展AOSP也無濟於事,除非您有權訪問每個物理設備,這些設備將用於對其進行根目錄或對其進行自定義構建。非系統應用程序(com.android.phone包)無法訪問PhoneApp功能。

+0

謝謝。就我而言,我很幸運,因爲我只需要瞄準單個設備Nexus5。另外,我正在'kiosk模式'下運行一個應用程序。 AOSP中的ActivityManager不控制堆疊新的活動,例如來電屏幕? –

+0

是的,您可以輪詢InCallScreen活動以瞭解它何時處於活動狀態,以提高您的屏幕位於其上的信心(http://stackoverflow.com/questions/18115493/android-dynamicly-get-the-current-activity在前景)或者你想嘗試使用反射來修改/防止InCallScreen顯示?如果您使用平臺密鑰對您的應用程序進行簽名,則使用反射的ActivityManager調用將僅適用。換句話說,它只適用於定製的Android版本。 – Jim