Как принять входящий звонок, нажав кнопку? - PullRequest
9 голосов
/ 06 мая 2010

Я пытаюсь реализовать свой собственный интерфейс обработки телефонных звонков.

Что я хочу сделать, так это то, что при поступлении вызова отображается номер входящего телефона и изображение, и, если я нажимаю кнопку, входящий вызов будет принят / получен ответ.

Соответствующий код:

 @Override
  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    answerButton = (Button) findViewById(R.id.pickup);
    answerButton.setOnClickListener(new OnClickListener() {
        public void onClick(final View v) {
            Intent intent = new Intent("android.intent.action.ANSWER");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);          
        }
    });

К сожалению, код не работает. Сначала выдается исключение, если я нажимаю кнопку ответа:

ActivityNotFoundException: не найдено действие для обработки намерения {
акт = android.intent.action.ANSWER

Затем я добавил запись в AndroidManifest.xml:

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

Я снова запускаю приложение, больше нет исключений. Однако я сомневаюсь, что входящий звонок на самом деле не принят. Потому что, если нажать кнопку ответа на экране Android (зеленую кнопку), входящий вызов будет принят, а в левом верхнем углу экрана эмулятора отобразится зеленый значок вызова, а мое приложение - нет.

Я также прочитал исходный код приложения «Телефон» в исходном коде Android. В классе Phone есть такой метод acceptCall (). Но мне кажется, что использовать эти коды сложно, потому что в коде есть много объявлений об импорте, таких как:

import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.CallerInfo;
import com.android.internal.telephony.CallerInfoAsyncQuery;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.MmiCode;
import com.android.internal.telephony.Phone;

И, если я добавлю этот импорт в мой код, будет слишком много ошибок, таких как:
The import com.android.internal.telephony cannot be resolved.

Как правильно и просто решить мою проблему?

Ответы [ 5 ]

1 голос
/ 19 мая 2011

Намерение android.intent.action.ANSWER почему-то не работает должным образом. Существует обходной путь, эмулирующий кнопку Bluetooth для ответа на входящий вызов. Вы можете увидеть пример проекта auto-answer .

1 голос
/ 07 мая 2010

Добавить категорию "android.intent.category.DEFAULT" (Intent.CATEGORY_DEFAULT)

0 голосов
/ 22 февраля 2014

Измените ваш метод приема вызовов следующим образом:

public static void acceptCall(Context context) 
{
    Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, 
      new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
    context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
} 
0 голосов
/ 18 июня 2012

Это возможно при использовании пакета com.android.internal.telephony, но вы должны найти способ использовать эти методы в eclipse, и ваше приложение должно быть скомпилировано как системное приложение с использованием исходного кода Android.

0 голосов
/ 02 января 2012

Вам необходимо создать широковещательный приемник, в котором вы будете получать событие, когда ваш телефон звонит, и после этого вы сможете запустить желаемое действие. Вы не можете заменить экран входящего вызова по умолчанию, пока не используете ПОЛЬЗОВАТЕЛЬСКИЙ ПЗУ. И не забудьте установить приоритет в широковещательном приемнике в файле манифеста. Как только вы получите событие, вы можете использовать объект ITelephony с помощью отражения. И это может предоставить вам методы для ответа или отклонения вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...