Android MediaPlayer中stop()后再次不能播放铃声的问题以及两种解决办法

设置“播放”,“暂停”,“停止”三个按键

第一种方法,设置状态变量(音频文件存放在res/raw里)

修改前,停止后不能再次播放音频
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MediaPlayer mediaPlayer=MediaPlayer.create(this,R.raw.daichi);
        Button btn_play=findViewById(R.id.play);
        Button btn_pasue=findViewById(R.id.pause);
        Button btn_stop=findViewById(R.id.stop);
        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.start();
            }
        });
        btn_pasue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
            }
        });
        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
            }
        });

    }
}
修改后,停止后可以从头播放音频

设置静态变量isstopped保存当前是否为stop状态。
btn_play监听器中判断isstopped状态,true则从头播放,false则继续播放;
btn_pasue监听器中的判断是保证按“停止”后按“暂停”再按“播放”可以重头播放;
btn_stop监听器中弃用stop(),改用pause,设置isstopped状态为true。

public class MainActivity extends AppCompatActivity {

    static boolean isstopped=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MediaPlayer mediaPlayer=MediaPlayer.create(this,R.raw.daichi);
        Button btn_play=findViewById(R.id.play);
        Button btn_pasue=findViewById(R.id.pause);
        Button btn_stop=findViewById(R.id.stop);
        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isstopped==true){
                    mediaPlayer.seekTo(0);
                    mediaPlayer.start();
                    isstopped=false;
                }else{mediaPlayer.start();
                    isstopped=false;
                }
            }
        });
        btn_pasue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isstopped==true){
                    mediaPlayer.pause();
                }else{
                    isstopped=false;
                    mediaPlayer.pause();
                }
            }
        });
        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
                isstopped=true;
            }
        });
    }
}

第二种方法,设置完成事件监听器(setOnCompletionListener)

此方法需要通过AS右侧的Device File Explorer在sdcard中添加音频文件,程序将通过URI获取到文件

在这里插入图片描述

修改后
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private MediaPlayer mediaPlayer=new MediaPlayer();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        File file=new File("/sdcard/daichi.flac");
        if (file.exists()){     //判断是否找到文件,未找到则弹出提示框
            MediaPlayer mediaPlayer=MediaPlayer.create(this, Uri.parse(file.getAbsolutePath()));
        }else{
            Toast.makeText(this, "未找到文件", Toast.LENGTH_SHORT).show();
            return;
        }
        Button btn_play=findViewById(R.id.play);
        Button btn_pasue=findViewById(R.id.pause);
        Button btn_stop=findViewById(R.id.stop);
        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.start();
            }
        });
        btn_pasue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
            }
        });
        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {   //完成事件监听器
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.reset();
                try {
                    mp.setDataSource(file.getAbsolutePath());
                    mp.prepare();
                    mp.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

注意:第二种方法需要在AndroidManifest.xml里添加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

并在模拟器设置里给予存储空间权限,否则程序将会闪退
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值