当代码收到来电时,我试图播放音频文件。问题是,当收到来电时,音频文件开始播放两次或重叠声音。另外问题是在结束通话后音频文件没有暂停或停止它将一直播放,直到音频文件没有结束。 我试过的代码如下:
public void onReceive(final Context context, Intent intent) {
try{
final MediaPlayer mp= MediaPlayer.create(context,R.raw.audio);
String state= intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){
Toast.makeText(context, "Ringing!", Toast.LENGTH_SHORT).show();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent1 = new Intent(context, AcceptCall.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent1);
mp.setLooping(false);
mp.start();
}
}, 4000);
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Toast.makeText(context, "Received!", Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){
try{
mp.reset();
mp.pause();
mp.seekTo(0);
Toast.makeText(context, "Idle!", Toast.LENGTH_SHORT).show();
}catch(Exception e){e.printStackTrace();}
}
}catch (Exception e){
e.printStackTrace();
}
}
帮助我解决这个问题
答案 0 :(得分:0)
首先,您没有发布与之前创建的相同的MediaPlayer
实例。
对MediaPlayer.create(context,R.raw.audio);
的调用每次都会创建一个新的MediaPlayer
实例。因此,当您第一次收到广播EXTRA_STATE_RINGING
时,您会在收到MP_1
时第二次开始EXTRA_STATE_IDLE
,您会创建新的MP_2
并停止/释放该实例。而是在BroadCast
课程中保留MediaPlayer参考,只在TelephonyManager.EXTRA_STATE_RINGING
中创建一个。像这样:
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){
Toast.makeText(context, "Ringing!", Toast.LENGTH_SHORT).show();
mp= MediaPlayer.create(context,R.raw.audio);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent1 = new Intent(context, AcceptCall.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent1);
mp.setLooping(false);
mp.start();
}
}, 4000);
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){
try{
mp.stop();
mp.release();
Toast.makeText(context, "Idle!", Toast.LENGTH_SHORT).show();
}catch(Exception e){e.printStackTrace();}
}
所以稍后当你在TelephonyManager.EXTRA_STATE_IDLE
中发布它时,你会释放并停止同一个。
另请注意,我还替换了mp.reset()...
。