Erkennung ausgehender Anrufe, die auf Android angenommen wurden

9

Ich weiß, das wurde schon oft gefragt, ohne Antworten, aber ich hoffe immer noch, dass jemand das Problem endlich gelöst hat.

Das Problem: Ich habe ein nicht gerootetes Gerät mit Android 2.3. Ich muss einen Dienst erstellen, der:

  1. ruft an;
  2. wartet bis der Anruf beantwortet wird;
  3. hängt das Telefon, nachdem der Anruf beantwortet wurde (mit einer Zeitüberschreitung);

Wie viele andere bin ich bei # 2 geblieben. Im Folgenden finden Sie die Zusammenfassung der vorgeschlagenen Lösungen:

  • Benutze PhoneStateListener (am beliebtesten): funktioniert nicht, für einen ausgehenden Anruf kann er nicht erkennen, was ich brauche.
  • Verwende com.android.internal.telephony.CallManager und seine Methoden wie registerForPreciseCallStateChanged (zB dieser ): funktioniert nicht, nein Telefone sind darin registriert, so dass die Ereignisse nicht ausgelöst werden.
  • Verwenden Sie com.android.internal.telephony.PhoneFactory , um eine com.android.internal.telephony.Phone -Instanz zu erhalten (was der Schlüssel zu allem ist): funktioniert nicht, die Factory wird nicht initialisiert; Versuche, es mit einem Aufruf von makeDefaultPhones zu initialisieren, führen zu einer Sicherheitsausnahme (wie hier ).
  • Erkenne den ausgehenden Klingelton ( Link ): der Autor - Dany Poplawec - gibt an, dass die Erkennung von Klingeltönen zwar zur Lösung des Problems beitragen kann, aber keine Details liefert. Daher konnte ich diese Technik nicht ausprobieren.

Es sieht so aus, als ob alles bereits ausprobiert wurde, aber es könnte noch einen Trick geben, der mich retten wird:)

    
Alex Kiselev 22.05.2013, 04:59
quelle

2 Antworten

0

Ich versuche das auch zu bekommen und kann noch keine Lösung finden.

Beim Blick auf den Android-Quellcode habe ich diese Zeilen in ~ / kitchen / jellybean / frameworks / opt / telefonie / src / java / com / android / internal / telephony / Call.java

gefunden %Vor%

Ich denke, man könnte wissen, ob ein ausgehender Anruf beantwortet wurde und den ACTIVE-Status überprüft hat, aber ich weiß nicht, wie man diesen Wert aus einer App liest, vielleicht das Framework modifizieren, indem man eine spezifische Funktion wie folgt hinzufügt:

%Vor%

Das ist nur eine Idee, aber ich bin mir nicht sicher, wie ich das umsetzen soll, da offensichtlich andere Modifikationen für den Zugriff auf diese neue Funktion von der Anwendungsebene aus vorgenommen werden müssen.

Wenn Sie dies praktikabel finden oder wissen, wie es geht, werden Hilfe und Feedback sehr geschätzt.

    
1087427 26.08.2013 16:32
quelle
0

Die Lösung in Ihrem dritten Aufzählungszeichen sollte in gerooteten Geräten möglich sein, wenn Sie den Anweisungen in Android INJECT_EVENTS Erlaubnis

Schritt für Schritt ist es etwas wie:

  1. Signieren der App mit dem Plattformzertifikat Dies erfordert die folgenden Schritte:
    • Fügen Sie android: sharedUserId="android.uid.phone" zum Manifest-Tag des Manifestes Ihrer Apk hinzu.
    • Fügen Sie android: process="com.android.phone" zum Anwendungs-Tag des Manifests hinzu.
    • Sie müssen möglicherweise einige zusätzliche Berechtigungen zu Ihrem Manifest hinzufügen und müssen außerdem den Schweregrad für ProtectedPermission in den "Android Lint Preferences" Ihres Projekts ändern.
    • Holen Sie sich platform.pk8 + platform.x509.pem von {Android Source} / build / target / product / security (ich habe die für 4.4.4r1 in Ссылка )
    • Laden Sie keytool-importkeypair von Ссылка herunter
    • Verwenden Sie dieses Skript, um den Keystore für die Plattform mit folgendem Befehl abzurufen: keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem-alias-plattform . Ich habe es auf Cygwin ausgeführt, mit einer kleinen Modifikation des Skripts.
    • Unterschreibe die apk mit diesem Schlüsselspeicher.
  2. Installieren Sie die Anwendung als System-App mit adb:

      

    adb root

         

    adb remount

         

    adb push MyApp.apk / system / app

         

    adb-Shell chmod 644 /systen/app/MyApp.apk

  3. Starten Sie das Gerät neu.

Ich habe tatsächlich die Lösung in der 2. Kugel versucht und es funktioniert auch nicht für mich (auf einem Galaxy S5 mit Kitkat). Die Lösung im dritten Aufzählungspunkt funktioniert ganz gut. Ungeachtet des Paketnamens wird die App als com.android.phone ausgeführt. Sie müssen also an diesen Prozess anhängen, wenn Sie die App debuggen möchten.

    
JuanNoguera 05.08.2014 20:56
quelle

Tags und Links