Завершить звонок в Android - PullRequest
       45

Завершить звонок в Android

3 голосов
/ 29 сентября 2010

Я пытаюсь завершить новый исходящий звонок через несколько секунд. Вот мой код:

public class phonecalls extends Activity {
    ComponentName cn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        call();
    }
    private void call() {
        try {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:123456789"));
            startActivity(callIntent);
            cn = new ComponentName(getApplicationContext(), Receiver.class);
        } catch (ActivityNotFoundException activityException) {
            Log.e("dialing-example", "Call failed", activityException);
        }
    }
}

Мой класс приемника:

public class Receiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            setResultData(null);
        }
    }
}

Я не могу прервать исходящий вызов. Я новичок в Android и не могу заставить его работать.

Ответы [ 4 ]

4 голосов
/ 26 января 2011

Класс BroadcastReceiver должен перехватывать все вызовы.Проверьте, правильно ли зарегистрирован класс получателя в AndroidManifest.xml:

<receiver android:name="Receiver" android:exported="true" android:enabled="true">
    <intent-filter android:priority="1">
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        <action android:name="android.intent.action.PHONE_STATE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

Тем не менее, я не верю, что можно отменить вызов после завершения функции приемника.Я пытался переместить setResultData(null) в поток с задержкой в ​​несколько секунд, но я считаю, что причина этого не в том, что намерение уже выполнено и вызов был запущен.

Единственный способто, что это могло бы быть возможно, запачкало ваши руки внутренними вызовами API в PhoneFactory .Было много попыток сделать это (насколько мне известно, безуспешно), и есть громкое «не делай этого!»от сообщества.

4 голосов
/ 26 января 2011

Вы не можете завершить звонок в Android.В тот момент, когда вы вызываете startActivity (callIntent), вы отдаете управление собственному приложению вызывающей стороны.Теперь вызов можно прервать только через приложение телефона.

Кроме того, ваш код после начала вызова не имеет особого смысла.Вы ничего не делаете с созданным вами ComponentName, поэтому метод onReceive вашего Receiver никогда не будет вызываться.Также, если получателю будет вызван код в методе onReceive, он ничего не изменит для изменения состояния телефонного звонка.

1 голос
/ 27 апреля 2012

Мое решение

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);              
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
getContext().sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
1 голос
/ 13 февраля 2011

Вы можете включить режим полета (требуется правильная настройка) и отключить его вскоре после этого.

Конечно, это может привести к потере подключения 3G на короткое время (несколько секунд).

...