Android的MediaPlayer的错误(-38,0)"停止叫状态0" [英] Android MediaPlayer Error (-38, 0) "stop called in state 0"

查看:2771
本文介绍了Android的MediaPlayer的错误(-38,0)"停止叫状态0"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经看过了各种不同的网站寻找这个问题在我的code的解决方案。这是一个基本的音频播放器,3个按钮:播放,暂停和停止。播放和暂停工作确定,所以没有停下,但一旦音频已经停止它拒绝重新开始,抛出一个错误:

  E / MediaPlayer的:停止叫状态0
E / MediaPlayer的:错误(-38,0)
E / MediaPlayer的错误:(-38,0)
 

这是我MainActivity.java:

 进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.net.Uri;
进口android.os.Bundle;
进口android.os.Handler;
进口android.view.Menu;
进口android.view.View;
进口android.widget.Button;
进口android.widget.SeekBar;

进口java.io.IOException异常;

公共类MainActivity扩展活动实现MediaPlayer.On preparedListener {

    静电按钮为playButton;
    静电按钮暂停按钮;
    静电按钮STOPBUTTON;
    静态搜索栏搜索栏;
    私有静态的MediaPlayer播放器;
静态处理程序处理程序;
静态乌里音频;

@覆盖
保护无效的onCreate(包savedInstanceState){
    球员= MediaPlayer.create(这一点,R.raw.airbourne_runnin_wild);
    乌里音频= Uri.parse(android.resource://+ getPackageName()+/+ R.raw.airbourne_runnin_wild);
    尝试 {
        player.setDataSource(getAssets()openFd(原始/ airbourne_runnin_wild.mp3)getFileDescriptor());
    }赶上(IOException异常E){
        e.printStackTrace();
    }
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    为playButton =(按钮)findViewById(R.id.playButton);
    暂停按钮=(按钮)findViewById(R.id.pauseButton);
    STOPBUTTON =(按钮)findViewById(R.id.stopButton);
    搜索栏=(搜索栏)findViewById(R.id.seekBar);

    player.setOn preparedListener(本);

    处理程序=新的处理程序();

    seekBar.setMax(player.getDuration());

    playButton.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(视图查看){
            如果(!player.isPlaying()){
                尝试 {
                    player.setDataSource(getAssets()openFd(原始/ airbourne_runnin_wild.mp3)getFileDescriptor());
                }赶上(IOException异常E){
                    e.printStackTrace();
                }
                player.start();
                updateSeekBar();
            }
        }
    });

    pauseButton.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(视图查看){
            如果(player.isPlaying()){
                player.pause();
            }
        }
    });

    stopButton.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(视图查看){
            如果(player.isPlaying()){
                player.stop();
                seekBar.setProgress(0);
                seekBar.invalidate();
                尝试 {
                    player.setDataSource(getAssets()openFd(原始/ airbourne_runnin_wild.mp3)getFileDescriptor());
                }赶上(IOException异常E){
                    e.printStackTrace();
                }
            }
        }
    });

    seekBar.setOnSeekBarChangeListener(新SeekBar.OnSeekBarChangeListener(){
        @覆盖
        公共无效onProgressChanged(搜索栏搜索栏,INT I,布尔B){
            如果(B)的{
                seekChanged(搜索栏,I,B);
            }
        }

        @覆盖
        公共无效onStartTrackingTouch(搜索栏搜索栏){

        }

        @覆盖
        公共无效onStopTrackingTouch(搜索栏搜索栏){

        }
    });

    player.setOnCompletionListener(新MediaPlayer.OnCompletionListener(){
        @覆盖
        公共无效onCompletion(MediaPlayer的媒体播放器){
            player.stop();
            seekBar.setProgress(0);
            //player.$p$ppareAsync();
            seekBar.invalidate();
        }
    });
}


@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    //充气菜单;这增加了项目操作栏,如果它是present。
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}

@覆盖
在prepared公共无效(MediaPlayer的媒体播放器){
    playButton.setEnabled(真正的);
}

公共无效seekChanged(搜索栏搜索栏,INT进步,布尔FROMUSER){
    player.seekTo(进度);
}

公共无效updateSeekBar(){
    seekBar.setProgress(player.getCurrentPosition());

    如果(player.isPlaying()){
        可运行的通知=新的Runnable(){
            公共无效的run(){
                updateSeekBar();
            }
        };
        handler.postDelayed(通知,1500);
    }
}
}
 

和activity_main.xml:

 < TableLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:以下属性来=@扪/ activity_horizo​​ntal_margin
机器人:paddingRight =@扪/ activity_horizo​​ntal_margin
机器人:paddingTop =@扪/ activity_vertical_margin
机器人:paddingBottom会=@扪/ activity_vertical_margin
工具:上下文=MainActivity。>

<的TableRow
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>

    <按钮
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文本=播放
            机器人:ID =@ + ID /为playButton
            机器人:layout_gravity =center_horizo​​ntal |顶
            机器人:longClickable =假
            机器人:layout_weight =1
            机器人:layout_column =8
            机器人:启用=FALSE/>
< /的TableRow>

<的TableRow
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>

    <按钮
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文本=暂停
            机器人:ID =@ + ID /暂停按钮
            机器人:layout_gravity =center_horizo​​ntal |顶
            机器人:layout_weight =1
            机器人:layout_column =8
            机器人:layout_span =7/>
< /的TableRow>

<的TableRow
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>

    <按钮
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文本=停止
            机器人:ID =@ + ID / STOPBUTTON
            机器人:layout_column =8
            机器人:layout_span =24
            机器人:layout_weight =1/>
< /的TableRow>

<的TableRow
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>
< /的TableRow>

<的TableRow
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>

    <搜索栏
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:ID =@ + ID /搜索栏
            机器人:layout_column =8
            机器人:layout_span =24
            机器人:layout_weight =1/>
< /的TableRow>
 

如果有人可以帮助我解决这个错误,这将是更AP preciated。我已经搜查了全面的解决方案,并试图多,但似乎没有正常工作。

编辑:我改变了code一点点:

我的问题仍然是有关该错误的,这是现在我的编辑code:

 进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.net.Uri;
进口android.os.Bundle;
进口android.os.Handler;
进口android.view.Menu;
进口android.view.View;
进口android.widget.Button;
进口android.widget.SeekBar;

进口java.io.IOException异常;

公共类MainActivity扩展活动实现MediaPlayer.On preparedListener {

静电按钮为playButton;
静电按钮暂停按钮;
静电按钮STOPBUTTON;
静态搜索栏搜索栏;
私有静态的MediaPlayer播放器;
静态处理程序处理程序;
静态乌里音频;
静态布尔canMakeCall = FALSE;

@覆盖
保护无效的onCreate(包savedInstanceState){
    球员= MediaPlayer.create(这一点,R.raw.airbourne_runnin_wild);
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    为playButton =(按钮)findViewById(R.id.playButton);
    暂停按钮=(按钮)findViewById(R.id.pauseButton);
    STOPBUTTON =(按钮)findViewById(R.id.stopButton);
    搜索栏=(搜索栏)findViewById(R.id.seekBar);

    如果(canMakeCall =真){
        player.setOn preparedListener(本);

        处理程序=新的处理程序();

        seekBar.setMax(player.getDuration());

        playButton.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图查看){
                如果(!player.isPlaying()){
                    player.start();
                    updateSeekBar();
                }
            }
        });

        pauseButton.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图查看){
                如果(player.isPlaying()){
                    player.pause();
                }
            }
        });

        stopButton.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图查看){
                如果(player.isPlaying()){
                    player.stop();
                    seekBar.setProgress(0);
                    seekBar.invalidate();
                    尝试 {
                        播放器prepare()。
                    }赶上(IOException异常E){
                        e.printStackTrace();
                    }
                }
            }
        });

        seekBar.setOnSeekBarChangeListener(新SeekBar.OnSeekBarChangeListener(){
            @覆盖
            公共无效onProgressChanged(搜索栏搜索栏,INT I,布尔B){
                如果(B)的{
                    seekChanged(搜索栏,I,B);
                }
            }

            @覆盖
            公共无效onStartTrackingTouch(搜索栏搜索栏){

            }

            @覆盖
            公共无效onStopTrackingTouch(搜索栏搜索栏){

            }
        });

        player.setOnCompletionListener(新MediaPlayer.OnCompletionListener(){
            @覆盖
            公共无效onCompletion(MediaPlayer的媒体播放器){
                mediaPlayer.stop();
                //player.stop();

                seekBar.setProgress(0);
                //player.$p$ppareAsync();
                seekBar.invalidate();
            }
        });
    }
}


@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    //充气菜单;这增加了项目操作栏,如果它是present。
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}

@覆盖
在prepared公共无效(MediaPlayer的媒体播放器){
    playButton.setEnabled(真正的);
    canMakeCall = TRUE;
}

公共无效seekChanged(搜索栏搜索栏,INT进步,布尔FROMUSER){
    player.seekTo(进度);
}

公共无效updateSeekBar(){
    seekBar.setProgress(player.getCurrentPosition());

    如果(player.isPlaying()){
        可运行的通知=新的Runnable(){
            公共无效的run(){
                updateSeekBar();
            }
        };
        handler.postDelayed(通知,1500);
    }
}
}
 

我试图让工作没有一个搜索栏也一样,只是为了确保不会导致一个错误的基础知识,但它位于这出戏的逻辑中的某个地方/暂停/停止code,因为它是生产相同甚至错误使用SeekBar code省略。

解决方案

现在的问题是,一旦你,你的setDataSource 再次停止它。你必须再调用 prepare()

<$p$p><$c$c>player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 播放器prepare()。

每当你叫的setDataSource()就可以了,你将需要 prepare()再次它。把它看成是加载文件,准备用于播放。

顺便说一句,我注意到你混淆了呼叫 MediaPlayer.create()也叫的setDataSource()多次相同的文件。有没有必要做这个。一旦MediaPlayer正在创建prepared(其中调用 .create()为你做),你可以叫 .stop() .pause() .play()就可以了,没有必要将其复位所有的时间。

I have looked at various different websites looking for a solution for this problem in my code. It is a basic audio player with 3 buttons: play, pause and stop. Play and pause work ok and so does stop but once the audio has been stopped it refuses to start again, throwing an error:

E/MediaPlayer: stop called in state 0
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)

This is my MainActivity.java:

import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

    static Button playButton;
    static Button pauseButton;
    static Button stopButton;
    static SeekBar seekBar;
    private static MediaPlayer player;
static Handler handler;
static Uri audio;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    Uri audio = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.airbourne_runnin_wild);
    try {
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
    } catch (IOException e) {
        e.printStackTrace();
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    player.setOnPreparedListener(this);

    handler = new Handler();

    seekBar.setMax(player.getDuration());

    playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (!player.isPlaying()) {
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                player.start();
                updateSeekBar();
            }
        }
    });

    pauseButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.pause();
            }
        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.stop();
                seekBar.setProgress(0);
                seekBar.invalidate();
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if (b) {
                seekChanged(seekBar, i, b);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            player.stop();
            seekBar.setProgress(0);
            //player.prepareAsync();
            seekBar.invalidate();
        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

And activity_main.xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Play"
            android:id="@+id/playButton"
            android:layout_gravity="center_horizontal|top"
            android:longClickable="false"
            android:layout_weight="1"
            android:layout_column="8"
            android:enabled="false"/>
</TableRow>

<TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Pause"
            android:id="@+id/pauseButton"
            android:layout_gravity="center_horizontal|top"
            android:layout_weight="1"
            android:layout_column="8"
            android:layout_span="7"/>
</TableRow>

<TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Stop"
            android:id="@+id/stopButton"
            android:layout_column="8"
            android:layout_span="24"
            android:layout_weight="1"/>
</TableRow>

<TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
</TableRow>

<TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <SeekBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/seekBar"
            android:layout_column="8"
            android:layout_span="24"
            android:layout_weight="1"/>
</TableRow>

If anyone could help me resolve this error, it would be much appreciated. I have already searched round for solutions and tried multiple, but none seemed to work properly.

EDIT: I changed a little bit of the code:

My question is still about the error, and this is now my edited code:

import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

static Button playButton;
static Button pauseButton;
static Button stopButton;
static SeekBar seekBar;
private static MediaPlayer player;
static Handler handler;
static Uri audio;
static boolean canMakeCall = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    if (canMakeCall = true) {
        player.setOnPreparedListener(this);

        handler = new Handler();

        seekBar.setMax(player.getDuration());

        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (!player.isPlaying()) {
                    player.start();
                    updateSeekBar();
                }
            }
        });

        pauseButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.pause();
                }
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.stop();
                    seekBar.setProgress(0);
                    seekBar.invalidate();
                    try {
                        player.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                if (b) {
                    seekChanged(seekBar, i, b);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.stop();
                //player.stop();

                seekBar.setProgress(0);
                //player.prepareAsync();
                seekBar.invalidate();
            }
        });
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
    canMakeCall = true;
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

I have tried getting the basics working without a seekbar too, just to make sure that isn't causing an error but it lies somewhere within the logic of the play/pause/stop code because it was producing the same error even with the seekbar code omitted.

解决方案

The problem is once you've stopped it, you setDataSource again. You have to then call prepare()

player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
player.prepare();

Anytime you call setDataSource() on it you will need to prepare() it again. Think of it as loading the file, getting ready for playback.

By the way I notice you mix up calling MediaPlayer.create() and also call setDataSource() multiple times for the same file. There's no need to do this. Once the MediaPlayer is created and prepared (which calling .create() does for you), you can just call .stop(), .pause(), .play() on it, no need to reset it all the time.

这篇关于Android的MediaPlayer的错误(-38,0)&QUOT;停止叫状态0&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆