2012-04-07 44 views
11

Lên đến Android 2.2 Tôi biết tôi có thể sử dụng sự phản chiếu và chấm dứt cuộc gọi thông qua getITelephony.Làm thế nào để bạn lập trình kết thúc cuộc gọi trên 2.3+?

Tuy nhiên, tính đến 2.3 này không còn hoạt động vì ngay cả khi bạn cấp phép MODIFY_PHONE_STATE để ứng dụng của bạn, nó bây giờ là một ứng dụng hệ thống chỉ cho phép: https://stackoverflow.com/a/5095956/821423

Điều đó nói rằng, nó có thể vẫn còn vì vô số các ứng dụng trên thị trường google play đang làm nó chỉ tốt trên ICS, ví dụ, điều này một:

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

Vậy câu hỏi là, làm thế nào để họ làm điều đó? Tôi biết tôi có thể nhận cuộc gọi bằng cách mô phỏng móc tai nghe, nhưng tôi không thể tìm ra cách kết thúc cuộc gọi.

Cảm ơn bạn.

Trả lời

18

Sau nhiều lần tìm kiếm linh hồn tôi nhận ra điều gì đó thực sự, thực sự, thực sự câm. Về phía cộng không ai trên StackOverflow dường như đã nhận thấy nó. MODIFY_PHONE_STATE không còn hoạt động trên silenceRinger() kể từ 2.3+, nhưng endCall vẫn ổn.

Vì vậy, giải pháp là để nhận xét cuộc gọi đến silenceRinger().

Không thể tin rằng tôi đã dành một tuần cho việc này! Tôi sẽ cố gắng để cập nhật các câu hỏi khác như có vẻ là tấn dupe trên SO dọc theo dòng của 'nó không thể sử dụng phản ánh để chấm dứt các cuộc gọi nữa'.

+0

Bạn có nghĩa là, chúng tôi stil có thể sử dụng kỹ thuật ITelephony.aidl để chấp nhận và từ chối cuộc gọi programatically nhưng nó chỉ không làm việc cho silenceRinger? Sau đó, giải pháp duy nhất còn lại là để bình luận về silenceRinger trong tập tin aidl? Xin đề nghị, như phát hiện của bạn về điều này sẽ cho phép tôi sử dụng kỹ thuật này trong việc thiết kế một ứng dụng mới. –

+0

Trên 2.3.6, endCall() thông qua iTelephony thực hiện điều đó. Đó thực sự là silenceRinger() kích hoạt vấn đề quyền. Bạn có thể chỉ cần bình luận silenceRinger() trong mã thực tế của bạn, để lại AIDL như vậy. Tôi đã không thử nghiệm này trên 1,5-2,2, sắp sửa để làm như vậy mặc dù. Sẽ cho bạn biết trên trang này. –

+0

Wow ... Tôi đã thực sự có endCall() trong mã của tôi, nhưng nó đã không nhận được hit vì một số if-tuyên bố. Tôi cho rằng nó không hoạt động vì API đã bị vô hiệu hóa. Tôi bị cám dỗ gắn cờ câu trả lời của bạn để xóa vì vậy Google không khắc phục vấn đề này! :) +1 – you786

3

Các hàm gọi(), endcall() cũng hoạt động tốt cho tôi. Nhưng cũng có một cách khác tha hoạt động mà không cần sử dụng iTelephony.aidl. Được xuất bản trong bài đăng này. BTW Tôi nghĩ rằng google đã biết nhưng đối với một số lý do họ havent làm bất cứ điều gì với phần còn lại của chức năng, đó là tốt !!!

http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

+0

Như các tiểu bang blog, nó hiện đang bị chặn. – George

1

private void endCall (thức Chuỗi cutofftime) {

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(); 
    } 

} 
Các vấn đề liên quan