解决使用MediaPlayer开发时抛IllegalStateException异常的办法

今天编写自己的播放器时总是报了下面的错误,
而求错误指向mediaplayer.setDataSource()这个一行。
我反复看了很久也没觉得有什么错误,甚至利用Toast查看了SP的信息,发现确实是正确的文件路径,所以肯定不是路径的问题,后来去网上查了很多资料,各种各样但都没有效果,没办法接着分析自己写的代码逻辑,仔细看了看MainActivity中的iniMediaPlayer()方法,觉得很有问题,下面贴代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private MediaPlayer mediaPlayer = new MediaPlayer();
    public List musicList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button play = (Button)findViewById(R.id.play);
        Button stop = (Button)findViewById(R.id.stop);
        Button pause = (Button)findViewById(R.id.pause);
        ListView listView = (ListView)findViewById(R.id.list_view);
        play.setOnClickListener(this);
        stop.setOnClickListener(this);
        pause.setOnClickListener(this);
        if (Environment.getExternalStorageDirectory().listFiles(new MusicFilter()).length > 0){
            for (File file : Environment.getExternalStorageDirectory().listFiles(new MusicFilter())) {
                musicList.add(file.getAbsolutePath().substring(20));
                }
        }
        ArrayAdapter adapter = new ArrayAdapter<>(MainActivity.this,
                android.R.layout.simple_list_item_1, musicList);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String SD = "/storage/emulated/0/";
                String path =  musicList.get(i).toString();
                String SP = SD + path;
                Toast.makeText(MainActivity.this,SP,Toast.LENGTH_SHORT).show();
                try {

                     mediaPlayer.setDataSource(SP);
                     mediaPlayer.prepare();
                    mediaPlayer.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE },1);
        }else{
            initMediaPlayer();
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.play:
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();
                }
                break;

            case R.id.stop:
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.reset();
                    initMediaPlayer();
                }
                break;
            case R.id.pause:
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }
                break;
            default:
                break;
        }

    }
    private void initMediaPlayer(){
        try {
            File file = new File(Environment.getExternalStorageDirectory(),"m.mp3");
            mediaPlayer.setDataSource(file.getPath());
            mediaPlayer.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    initMediaPlayer();
                }else{
                    Toast.makeText(this,"无权限",Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}


 try {
                    mediaPlayer.reset();
                     mediaPlayer.setDataSource(SP);
                     mediaPlayer.prepare();
                    mediaPlayer.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
仔细想想,每次使用MediaPlarer都是要先初始化和释放资源的,也就是要reset()的,之前在设置listview点击事件时没有注意到这点,所以一直有这个异常,而这个异常可以解释为:因为java里面的mediaplayer对象的状态和native的对象状态发生了不一致。也就是说,你在用MediaPlayer之前没有初始化或者没有回复到原来刚创建是的状态,所以只要加上这一句就可以了:

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`java.lang.IllegalStateException` 是一个运行异常,通常发生在代码尝试在不合适的间调用某个方法或操作。以下是几种可能导致该异常的情况和解决方法: 1. 操作状态错误:当尝试在未准备好的状态下执行某个操作,将出 `IllegalStateException`。例如,在视图还没有完成布局之前尝试访问视图的大小或位置。解决方法是确保在执行任何操作之前,所有必要的资源都已准备好,如使用 `View.post()` 方法在视图完成布局后再进行操作。 2. 资源已释放:当尝试使用已经被释放的资源或对象,将出 `IllegalStateException`。例如,在使用已经关闭的数据库连接或已经释放的线程池执行任务,都会导致该异常解决方法是确保资源在使用之前都处于可用状态,并且在使用后及释放资源。 3. 状态转换错误:当尝试从一个状态转换到另一个状态,如果状态转换不合法,则会出 `IllegalStateException`。例如,在 `MediaPlayer` 对象还没有准备好尝试播放音频文件,将出该异常解决方法是确保在进行状态转换之前,所有必要的操作和条件都已满足。 4. 数据格式错误:当尝试使用不正确的数据格式或类型,将出 `IllegalStateException`。例如,在尝试将一个非数字字符串转换为数字,将出该异常解决方法是确保使用正确的数据格式和类型进行操作,并进行必要的数据类型转换。 总之,要避免 `IllegalStateException` 异常,需要仔细检查代码中所有操作的前提条件和后置条件,并确保在进行任何操作之前,所有必要的资源和条件都已准备好。同,需要合理地处理异常情况,以避免程序崩溃或出现不可预期的行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值