2013-05-22 11 views
9

Wiem, że zostało to zadane już wiele razy, bez odpowiedzi, ale nadal mam nadzieję, że ktoś w końcu rozwiązał problem.Wykrywanie połączenia wychodzącego odpowiedział na Androida

Problem: Mam urządzenie nierootowane z systemem Android 2.3. Muszę utworzyć usługę, która:

  1. wykonuje połączenie telefoniczne;
  2. czeka, aż połączenie zostanie odebrane;
  3. zawiesza telefon po odebraniu połączenia (z przekroczeniem limitu czasu);

Podobnie jak wiele innych, utknąłem z # 2. Poniżej znajduje się podsumowanie rozwiązań kiedykolwiek zaproponował:

  • Zastosowanie PhoneStateListener (najbardziej popularne): nie działa dla połączenia wychodzącego nie można wykryć to, czego potrzebuję.
  • Użyj metody i jej metod, takich jak registerForPreciseCallStateChanged (np. this one): nie działa, żadne telefony nie są w niej zarejestrowane, więc zdarzenia nie są uruchamiane.
  • Użyj com.android.internal.telephony.PhoneFactory, aby uzyskać instancję com.android.internal.telephony.Phone (która jest kluczem do wszystkiego): nie działa, fabryka nie jest inicjowana; próbuje zainicjować go z wynikiem wywołania makeDefaultPhones w wyjątku bezpieczeństwa (np. here).
  • Wykrywanie wychodzącego dzwonka (link): autor - Dany Poplawec - stwierdza, że ​​wykrywanie dzwonków może pomóc w rozwiązaniu problemu, ale nie dostarcza żadnych szczegółów, więc nie mogłem wypróbować tej techniki.

Wygląda na to wszystko zostało już próbowałem, ale wciąż może być jeszcze jeden trik, który będzie mnie uratować :)

+0

Czy masz jakieś rozwiązanie? – Noundla

+0

Niestety, wygląda na to, że nic nie można zrobić, oprócz modyfikacji samego systemu Android. –

Odpowiedz

0

Próbuję dostać to też i nie może znaleźć żadnego rozwiązania jeszcze.

Patrząc na Android Kod nieśmiertelności znalazłem te linie w ~/kuchni/Jellybean/ram/opt/telefonia/src/java/com/android/wewnętrzny/telefonia/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; 
    } 
} 

I że może wiedzieć, czy połączenie wychodzące odpowiedział sprawdzając stan aktywny, ale nie wiem, jak czytać tę wartość od aplikacji, może modyfikację ram dodając specyficzną funkcję za to jak:

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

To tylko pomysł, ale nie jestem pewien, jak to wdrożyć, ponieważ oczywiście należy wykonać inne modyfikacje, aby uzyskać dostęp do tej nowej funkcji z poziomu warstwy aplikacji.

Jeśli okaże się, że jest to wykonalne lub wiesz, jak to zrobić, pomoc i opinie będą bardzo cenne.

0

Rozwiązaniem w 3 kula powinna być możliwa w urządzeniach zakorzenione jeśli postępuj zgodnie z instrukcjami w Android INJECT_EVENTS permission

krok po kroku, to jest coś takiego:

  1. Podpisywanie aplikacji z certyfikatem platformy .Wymaga to następujące czynności:
    • dodać androida: sharedUserId = "android.uid.phone" do manifestu-tag swoich apk's oczywistych.
    • dodać android: process = "com.android.phone" do znacznika aplikacji manifestu.
    • Być może będziesz musiał dodać kilka dodatkowych uprawnień do manifestu, a także będzie musiał zmienić stopień ochrony dla ProtectedPermission w "Preferencjach Linii Androida" swojego projektu.
    • uzyskać platform.pk8 + platform.x509.pem z Androidem Źródło {}/build/target/produktu/bezpieczeństwo (Użyłem tych dla 4.4.4r1 w https://android.googlesource.com/platform/build/+/android-4.4.4_r1/target/product/security/)
    • Pobierz keytool-importkeypair od https://github.com/getfatday/keytool-importkeypair
    • Ten skrypt umożliwia uzyskanie magazynu kluczy platformy za pomocą polecenia: keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platforma. Uruchomiłem go na cygwin, z drobną modyfikacją skryptu.
    • Podpisz apk, używając tego pliku kluczy.
  2. zainstalować aplikację jako aplikacja systemu przy użyciu adb:

    adb korzeń

    adb remount

    adb Push MyApp.apk/system/app

    adb shell chmod 644 /systen/app/MyApp.apk

  3. Uruchom ponownie urządzenie.

Rzeczywiście wypróbowałem rozwiązanie w 2-punktor i to też nie działa dla mnie (na Galaxy S5 z systemem KitKat). Rozwiązanie w trzecim punkcie wypunktowania działa całkiem nieźle. Bez względu na nazwę pakietu, aplikacja działa jako com.android.phone, więc musisz dołączyć do tego procesu, jeśli chcesz debugować aplikację.

+0

Cóż, z rootem możliwe są różne rzeczy. Jednak jednym z moich kluczowych wymagań było używanie urządzenia magazynowego bez dostępu do roota. W każdym razie dziękuję za udostępnienie, może pewnego dnia pomocne :) –

+0

W wersjach Androida wcześniejszych niż 4.1 możesz analizować dane wyjściowe logcat z poziomu aplikacji dla większości zdarzeń związanych z połączeniami. To naprawdę brudne rozwiązanie, ale działałoby na urządzeniach nierootowanych. niestety nie jest to możliwe w nowszych wersjach Androida. – JuanNoguera

Powiązane problemy