当来电通过特定音频应答时音频重叠

时间:2017-07-07 10:58:50

标签: java android audio

当代码收到来电时,我试图播放音频文件。问题是,当收到来电时,音频文件开始播放两次或重叠声音。另外问题是在结束通话后音频文件没有暂停或停止它将一直播放,直到音频文件没有结束。 我试过的代码如下:

    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();
    }

}

帮助我解决这个问题

1 个答案:

答案 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()...