Остановка и запуск музыки на входящих звонках - PullRequest
54 голосов
/ 10 апреля 2011

Я реализовал Activity, которая воспроизводит мультимедиа с URL-адреса в Android

Чтобы добавить функцию паузы при входящем звонке, я создал приемник, который устанавливает переменную при поступлении звонка.Действие считывает эту переменную, а затем приостанавливает музыку в своем методе onPause () и сбрасывает, когда вызов завершается, и действие возобновляет музыку в своем методе onResume ()

.фокус.Если я возвращаюсь к домашнему экрану во время воспроизведения музыки, а затем поступает вызов, пауза активности не вызывается, и, следовательно, я могу «остановить и запустить музыку»

Какой выход для этого?Кто-нибудь реализовал медиаплеер, чтобы он постоянно перехватывал входящие и исходящие вызовы, останавливал и правильно запускал музыку?

Ответы [ 6 ]

91 голосов
/ 10 апреля 2011

Есть несколько вещей, которые вы можете сделать:

Прежде всего, вы можете прослушивать изменения в состоянии вызова, используя PhoneStateListener.Вы можете зарегистрировать слушателя в TelephonyManager:

PhoneStateListener phoneStateListener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            //Incoming call: Pause music
        } else if(state == TelephonyManager.CALL_STATE_IDLE) {
            //Not in call: Play music
        } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) {
            //A call is dialing, active or on hold
        }
        super.onCallStateChanged(state, incomingNumber);
    }
};
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}

Не забудьте отменить регистрацию слушателя, когда он больше не нужен, используя PhoneStateListener.LISTEN_NONE:

TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}

Для получения дополнительной информации читайтедокументация .

Еще одна вещь, которую вы можете сделать - прослушивание трансляции android.intent.action.PHONE_STATE.Он будет содержать дополнительный TelephonyManager.EXTRA_STATE, который даст вам информацию о звонке. Посмотрите документацию здесь .

Обратите внимание, что вам потребуется разрешение android.permission.READ_PHONE_STATE в обоих случаях.

49 голосов
/ 25 июля 2014

Я думаю, что AudioManager - лучшее и быстрое решение.Вот мой пример реализации:

public class MyActivity extends Activity implements OnAudioFocusChangeListener {

private AudioManager mAudioManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    ...
}

@Override
 public void onDestroy(){
     super.onDestroy();
     ...
     mAudioManager.abandonAudioFocus(this);
     ...
 }


@Override
public void onAudioFocusChange(int focusChange) {
    if(focusChange<=0) {
        //LOSS -> PAUSE
    } else {
        //GAIN -> PLAY
    }
}   

}

Надеюсь, это полезно для вас: -)

13 голосов
/ 05 ноября 2012

ИЛИ - Вы можете попробовать приложение Receiver.

Создание получателя с именем CallRecord.java

package com.example.callreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class CallReceiver extends BroadcastReceiver{
    TelephonyManager telManager;
    Context context;

@Override
public void onReceive(Context context, Intent intent) {


    this.context=context;

    telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

}

private final PhoneStateListener phoneListener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        try {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                //PAUSE
            break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {

            break;
            }
            case TelephonyManager.CALL_STATE_IDLE: {
                //PLAY
            break;
            }
            default: { }
            }
            } catch (Exception ex) {

            }
        }
    };
 }

Затем добавьте эту строку в manifest.xml файл, чтобы зарегистрировать его в приложении

<receiver android:name="CallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>
12 голосов
/ 01 ноября 2012

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

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

Чтобы запросить фокусирование звука, необходимо вызвать requestAudioFocus () из AudioManager, как показано в примере ниже:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);

if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // could not get audio focus.
}
5 голосов
/ 01 декабря 2014

ИМХО, лучший способ описан в документах: http://developer.android.com/training/managing-audio/audio-focus.html

2 голосов
/ 19 июня 2014

Для меня состояние простоя приходило во время входящего звонка, быстрое решение - это проверить приемник вещания

BroadcastReceiver phonestatereceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    Bundle extras = intent.getExtras();
    if (extras != null) {
      String state = extras.getString(TelephonyManager.EXTRA_STATE);
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
        //pause here
      }
      else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
        //pause here
      }
      else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
        //play here
      }
    }
  }
};
...