Остановка и запуск музыки при входящих вызовах



я реализовал действие, которое воспроизводит медиа с URL-адреса в android

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

Это прекрасно работает, пока деятельность имеет фокус. Если я уйду ... вернуться на главный экран во время воспроизведения музыки, а затем приходит вызов, onPause активности не вызывается и, следовательно, я могу " остановить и запустить музыку

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

112   6  

6 ответов:

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

прежде всего, вы можете прослушать изменения в состоянии вызова с помощью 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-разрешение в обоих случаях.

Я думаю, что 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
    }
}   

}

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

Я думаю 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.
}

или - вы можете попробовать приложение-получатель.

создать приемник с именем 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) {

            }
        }
    };
 }

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

<receiver android:name="CallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>

IMHO лучший способ описан в off docs:http://developer.android.com/training/managing-audio/audio-focus.html

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

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
      }
    }
  }
};
    Ничего не найдено.

Добавить ответ:
Отменить.