2012-04-07 12 views
11

Do systemu Android 2.2 Wiem, że mogę korzystać z refleksji i zakończyć połączenie poprzez getITelephony.Jak programowo zakończyć połączenie w wersji 2.3+?

Jednak od 2.3 to już nie działa, ponieważ nawet jeśli przyznają uprawnienie MODIFY_PHONE_STATE do aplikacji, to teraz aplikacja systemowa tylko uprawnienie: https://stackoverflow.com/a/5095956/821423

Powiedział, że jest to możliwe jeszcze bo mnóstwo zastosowań na rynku google Play robią to dobrze na ICS, na przykład ten:

https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en

Więc pytanie brzmi, jak oni to robią? Wiem, że mogę odebrać połączenie za pomocą symulacji haka zestawu słuchawkowego, ale nie wiem, jak zakończyć połączenie.

Dziękuję.

Odpowiedz

18

Po wielu poszukiwaniach duszy zdaję sobie sprawę z czegoś naprawdę, naprawdę, naprawdę głupiego. Na plusie nikt na StackOverflow też tego nie zauważył. MODIFY_PHONE_STATE nie działa już na silenceRinger() od 2.3+, ale endCall jest w porządku.

Rozwiązaniem jest skomentowanie wywołania metody silenceRinger().

Nie mogę uwierzyć, że spędziłem tydzień nad tym! Spróbuję zaktualizować pozostałe pytania, ponieważ wydaje się, że mnóstwo duplikatów na SO jest następstwem tego, że "nie można już używać refleksji do zakończenia połączeń".

+0

To znaczy, że możemy stil użyć techniki ITelephony.aidl akceptować i odrzucać połączenia programowo, ale to tylko nie działa silenceRinger? Jedynym rozwiązaniem pozostaje wypowiadanie komentarza silenceRinger w pliku pomocniczym? Pls sugeruje, ponieważ twoje odkrycie pozwoli mi wykorzystać tę technikę w projektowaniu nowej aplikacji. –

+0

W wersji 2.3.6, endCall() do iTelephony właśnie to robi. To rzeczywiście silenceRinger(), które wyzwala problem z uprawnieniami. Możesz po prostu skomentować silenceRinger() w swoim rzeczywistym kodzie, zostaw AIDL jako taki. Nie testowałem tego od 1,5 do 2,2, niedługo jednak to zrobię. Powiadomię Cię na tej stronie. –

+0

Wow ... W rzeczywistości miałem endCall() w moim kodzie, ale nie został trafiony z powodu niektórych instrukcji if. Po prostu założyłem, że to nie działa, ponieważ interfejs API został wyłączony. Kusi mnie, aby oznaczyć Twoją odpowiedź na usunięcie, więc Google nie rozwiązuje tego problemu! :) +1 – you786

1

private void Rozłącz (końcowe cutofftime String) {

TelephonyManager telephony = (TelephonyManager) srvs 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    Class c; 
    final com.android.internal.telephony.ITelephony telephonyService; 
    try { 
     c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName()); 
     Log.i("TelephonyClass Name", telephony.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     telephonyService = (ITelephony) m.invoke(telephony); 
     TimerTask task = new TimerTask() { 

      @Override 
      public void run() { 
       try { 
        if (telephonyService.isIdle() 
          || telephonyService.isOffhook() 
          || telephonyService.isRinging()) 
         telephonyService.endCall(); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     long delay = Integer.parseInt(cutofftime) * 1000; 
     new Timer().schedule(task, delay); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

}