在 phone 通话期间重复停止闹钟

Making a repeated alarm stop during a phone call

我的应用程序有一个带号码选择器的重复闹钟,所以如果我选择每隔一分钟重复一次,声音会每隔一分钟响一次,但如果用户接到 phone 电话,闹钟不会停止。我怎么解决这个问题?我应该在接收器 activity 中实现什么才能检测到 phone 呼叫?

接收者:

    import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;


public class MainReceiver extends BroadcastReceiver {



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

             MediaPlayer m=MediaPlayer.create(context, R.raw.sound2);
             m.start();

        }

    }

try code:

        final MediaPlayer m = MediaPlayer.create(context, R.raw.sound2);
        m.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                m.start();
            }
        });

        AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        am.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int focusChange) {
                Log.i("FOCUS",focusChange + "");
                if (focusChange > 0)
                    m.start();
                else
                    m.pause();
            }
        }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

或者让你的BroadcastReceiver接收器phone进入状态:

public class MainReceiver extends BroadcastReceiver {

    private static final String PLAYAUDIO = "PLAYAUDIO";
    private static final String PHONE_STATE = "android.intent.action.PHONE_STATE";
    private static MediaPlayer m;

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

        if (intent.getAction().equals(PLAYAUDIO)) {
            m= MediaPlayer.create(context, R.raw.sound2);
            m.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    m.start();
                }
            });
            m.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    m = null;
                }
            });
        } else
            if (intent.getAction().equals(PHONE_STATE)) {// NEW CALL STATE
                String extra = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (extra.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE) 
                                     && m != null)
                     m.start();
                else if (m != null)
                     m.pause();
            }

    }

}

AndroidManifest.xml 像这样:

    <receiver android:name="YourPackage.MainReceiver">
        <intent-filter>
            <action android:name="PLAYAUDIO"/>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
    //Add permistion
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

刚刚根据 AlarmManager.setRepeating 的 Android 文档更新了我上面的回答 bit:As(int 类型,long triggerAtMillis,long intervalMillis,PendingIntent 操作),它将继续出现,直到明确使用 cancel(PendingIntent) 删除。如果你正在使用这个 API 那么你要么必须在通话时取消它,要么在你的接收器中你必须添加通话条件并且只是 return 而不做任何事情。

伙计们,我终于弄明白了,我看到了几个 telephonymanager 的例子,我写了这个并且工作得很好。

public class MainReceiver extends BroadcastReceiver{        

@Override

public void onReceive(Context context, Intent intent) {

    MediaPlayer m=MediaPlayer.create(context, R.raw.sound2);

                TelephonyManager tm = 

                    (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                        

                switch (tm.getCallState()) {

                case TelephonyManager.CALL_STATE_RINGING:

                        m.stop();
                        break;

                case TelephonyManager.CALL_STATE_OFFHOOK:                                


                        m.stop();
                                break;


                case TelephonyManager.CALL_STATE_IDLE:                                


                             m.start();

                            break;

                } 

        }

}