在 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;
}
}
}
我的应用程序有一个带号码选择器的重复闹钟,所以如果我选择每隔一分钟重复一次,声音会每隔一分钟响一次,但如果用户接到 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;
}
}
}