2013-08-05 2 views
25

Я вижу много вопросов, которые невозможно завершить программным способом в Android. В то же время я вижу множество приложений для набора номера на рынке googleplay, где вы можете активировать вызов и отбросить его. Как они работают?Завершить вызов в android программно

Редактировать: Я где-то читал, что мое приложение должно быть системным приложением. Тогда как это сделать, и в чем разница между системными и пользовательскими приложениями?

+3

Что касается меня, то лучше [solutuion] [1] достичь этого. [1]: http://stackoverflow.com/questions/18977012/why-itelephony-aidl-works?lq=1 – bgplaya

+0

См http://android.stackexchange.com/q/27/440 для получения инструкций о том, как сделать приложение системным приложением. – Flow

ответ

42

Вам не нужно быть системным приложением. Во-первых, создать пакет com.internal.android.telephony в проекте, и поместить его в файл с именем «ITelephony.aidl»:

package com.android.internal.telephony; 

interface ITelephony {  

boolean endCall();  

void answerRingingCall();  

void silenceRinger(); 

} 

После того, как вы есть, что вы можете использовать этот код для завершения вызова:

TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
Class clazz = Class.forName(telephonyManager.getClass().getName()); 
Method method = clazz.getDeclaredMethod("getITelephony"); 
method.setAccessible(true); 
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager); 
telephonyService.endCall(); 

Вы можете использовать это, например, в PhoneStateListener. Для этого, чтобы работать, вы должны иметь разрешения в манифесте:

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

Edit: Извиняюсь за ужасного форматирования, я до сих пор не могу понять, как правильно сделать блоки кода здесь:/

+0

не может использоваться и без указанного разрешения вы не можете получить доступ к TelephonyManager во время выполнения. – VenomVendor

+1

@VenomVendor Напоминаю, что в процессе логарифма во время отладки выдается предупреждение в строках «не предоставления разрешения MODIFY_PHONE_STATE», но это не кажется проблемой, так как приведенный выше код работает как ожидалось на разных устройствах. Может быть, разрешение на самом деле не нужно? – bgse

+0

@bgse: Я получаю это как Ошибка, а не предупреждение. Это из-за minSdkVersion? Я установил его в 5. Я не могу добавить это разрешение в свое приложение –

0

SilenceRinger() делает не работает для версий Android 2.3+. Просто прокомментируйте это, другой код будет работать нормально. Надеюсь, это сработает для вас!

1

Наряду с добавлением интерфейса телефонии android и широковещательного приемника вам также потребуется добавить запись приемника манифеста android с действием android.intent.action.PHONE_STATE для приемника, с которым вы хотите справиться с намерением.

вы получите компиляции ошибки времени при добавлении

uses-permission android:name="android.permission.MODIFY_PHONE_STATE` 

в вашем файле манифеста. Но даже если мы удалим это, он автоматически отклонит входящие вызовы.

+1

use как это, чтобы избежать компиляции или любой другой ошибки – AshuKingSharma

0
public static boolean isCallActive(Context context){ 
    AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
    if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){ 
     return true; 
    } 

    return false; 
} 
Смежные вопросы