2014-01-08 14 views
5

Ich entwickle eine benutzerdefinierte Telefonie-Anwendung, die Anrufe empfangen kann. Verwenden Sie diesen Code für die Behandlung des eingehenden Anrufs https://code.google.com/p/auto-answer/source/browse/trunk/src/com/everysoft/autoanswer/AutoAnswerIntentService.javaAndroid-Telefonie-Anwendung, die den Fokus auf eingehende Anrufe hält

Leider verliert meine App den Fokus auf den eingehenden Anruf.

Dies war eine Teillösung für abgehende Anrufe Android- Telephone app that keeps focus on outgoing & incoming phoneCall

Was über eingehende Anrufe? Wie behalte ich den Fokus in meiner benutzerdefinierten App?

Ich vermute, dass dies beinhalten Herunterladen und Ändern des Quellcodes als einfach Zugriff auf das SDK gibt wenig Kontrolle über die integrierte Telefonanwendung.

+1

Bitte geben Sie den entsprechenden Code hier ein, nicht nur einen Link. –

+0

die gesamte Quellbibliothek? –

+0

Der Link, den ich gepostet habe, ist irrelevant, da jeder Ansatz zum Beantworten von Anrufen (den ich ausprobiert habe), der nur die Anwendungsschicht implementiert, zu einem Fokus der nativen Telefonanwendung führt. Daher meine Untersuchung des Quellcodes @ https://android.googlesource.com –

Antwort

0

Erwähnen Sie den folgenden Broadcast-Empfänger in der Datei 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

Danke, ich werde versuchen, aber ich habe viele fast identische zustandsbasierte Lösungen mit TelephonyManager versucht und sie hatten nicht den beabsichtigten Effekt. Der Anrufbeantwortungsbildschirm war immer noch sichtbar. Nexus 5 verwurzelt laufendes KitKat. Ich bin fast 100% sicher, dass der eigentliche AOSP gehackt werden muss. –

+0

Eigentlich "android.intent.action.NEW_OUTGOING_CALL" ist Broadcast bestellt.Indem dem Filter "Absicht" die höchste Priorität gegeben wird (die höchste Priorität hat, dass die Übertragung zuerst ausgelöst wird), können wir unsere App starten. Aber "android.intent.action.PHONE_STATE" ist eine ungeordnete Übertragung. Also ist die Priorität nicht nützlich. Alle werden gleichzeitig feuern. Also, ich denke, dass es für eingehende Anrufe nicht möglich ist. – user543

1

Da die Referenz Sie abgehende Anrufe akzeptabel ist, dann können Sie eine Aktivität vor dem Bildschirm für eingehende Anrufe kurz nach zeigt es. Die Schwierigkeit dabei ist, dass der Anrufstatus zu "RINGING" und dann auch zu "OFFHOOK" wechselt, aber das Telefon hat den InCallScreen nicht angezeigt, wenn diese gesendet werden.

Wie der Post, auf den Sie verwiesen haben, bettete diese Lösung die Telefonfunktion nicht tatsächlich in die App (wie eine Webansicht für das Surfen im Internet), sondern platziert eine Aktivität unmittelbar nach der Anzeige vor dem InCallScreen.

Bei eingehenden Anrufen, müssen Sie den Start Ihrer Tätigkeit verzögern, wie in diesem Beitrag:

Android - Customised New Incoming Call Screen

Sie alles auf dem Bildschirm an der Stelle setzen, der schwierige Teil ist die Bestimmung der Verzögerung Zeit, so dass es Ihren Bedürfnissen entspricht (langsam genug, damit der InCallScreen eine Chance hat, zu starten, aber schnell genug, um minimal störend zu sein).

Darüber hinaus wird selbst die Erweiterung von AOSP nicht helfen, es sei denn, Sie haben Zugriff auf jedes physische Gerät, wo diese verwendet werden, um sie zu rooten oder eine benutzerdefinierte Build auf ihnen zu bauen. Der Zugriff auf die PhoneApp-Funktionen ist für Nicht-System-Apps (das com.android.phone-Paket) nicht zugänglich.

+0

Danke. In meinem Fall bin ich insofern glücklich, als ich nur ein einziges Gerät, das Nexus5, anvisieren muss. Außerdem betreibe ich eine einzelne Anwendung im "Kiosk-Modus". Aktiviert der ActivityManager in AOSP nicht das Stapeln neuer Aktivitäten, z. B. den Bildschirm für eingehende Anrufe? –

+0

Ja, Sie können für die InCallScreen-Aktivität abfragen, um zu wissen, wann sie aktiv ist, um das Vertrauen zu verbessern, dass Ihr Bildschirm darüber ist (http://stackoverflow.com/questions/18115493/android-dynamicly-get-the-current-activity) -in-foreground) Oder möchten Sie versuchen, die Reflektion zu verwenden, um InCallScreen zu ändern/zu verhindern? ActivityManager-Aufrufe mit Reflektion funktionieren nur, wenn Sie Ihre App mit dem Plattformschlüssel signieren. Mit anderen Worten, es funktioniert nur mit einem benutzerdefinierten Android-Build. – Jim

Verwandte Themen