Android 媒体播放器出错

Error on Android Media player

目前我正在研究音乐播放器。请帮我解决这些错误

public class MainActivity extends Activity {

    Button playb,pauseb,stopb;

    SeekBar seeker;
    Handler seekhandler;
    MediaPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        player=new MediaPlayer();//.create(MainActivity.this, R.raw.spaceman);

        //Interface between code and xml
        playb=(Button)findViewById(R.id.play_button);
        stopb=(Button)findViewById(R.id.stop_button);
        pauseb=(Button)findViewById(R.id.pause_button);
        seeker=(SeekBar)findViewById(R.id.seekBar);


        try {
            player.prepare();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(),(CharSequence) e,Toast.LENGTH_SHORT ).show();
        }
        //Code for Play Button
        playb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view){
                player.stop();
                player.reset();
                seeker.setProgress(0);
                try {
                    player.prepare();
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(), (CharSequence) e,Toast.LENGTH_SHORT).show();

                }
                player.start();
                seeker.setMax(player.getDuration());
            }
        });


        //Code for Pause button
        pauseb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            player.pause();
            }
        });

        //code for Stop button
        stopb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

             player.reset();
            }
        });


        //Code for seekbar change listner
        seeker.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        Runnable runnable =new Runnable() {
            @Override
            public void run() {
                seeker.setProgress(player.getCurrentPosition());
                seekhandler.postDelayed(this,1000);

            }
        };
    }
}

错误:

09-19 20:16:15.342 25242-25242/main.deviac.com.seekbar E/AndroidRuntime: FATAL EXCEPTION: main Process: main.deviac.com.seekbar, PID: 25242 java.lang.RuntimeException: Unable to start activity ComponentInfo{main.deviac.com.seekbar/main.deviac.com.seekbar.MainActivity}: java.lang.IllegalStateException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2452) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) at android.app.ActivityThread.access0(ActivityThread.java:154) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:152) at android.app.ActivityThread.main(ActivityThread.java:5497) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method) at android.media.MediaPlayer.prepare(MediaPlayer.java:1158) at main.deviac.com.seekbar.MainActivity.onCreate(MainActivity.java:42) at android.app.Activity.performCreate(Activity.java:6285) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)  at android.app.ActivityThread.access0(ActivityThread.java:154)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:152)  at android.app.ActivityThread.main(ActivityThread.java:5497)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  09-19 20:16:15.344 25242-25242/main.deviac.com.seekbar D/AppTracker: App Event: crash 09-19 20:16:28.590 25409-25409/main.deviac.com.seekbar W/System: ClassLoader referenced unknown path: /data/app/main.deviac.com.seekbar-2/lib/arm64 09-19 20:16:28.669 25409-25409/main.deviac.com.seekbar W/System: ClassLoader referenced unknown path: /data/app/main.deviac.com.seekbar-2/lib/arm64

我将 mp3 文件 (spaceman) 保存在 res 目录下的 raw 文件夹中

您必须将 文件路径 添加到您的媒体播放器。只需在媒体播放器 class

中调用静态方法 create
MediaPlayer player = MediaPlayer.create(this, R.raw.yoursongfile);

或调用setDataSource方法

player.setDataSource("/sdcard/Music/songfile.mp3");//Path of your song location 

或者您也可以像下面这样访问资源

player.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/songfile"));

See this doc

欢迎使用 Android 的媒体播放器,或者我称之为 "state-based hell"。

你原来的错误是由于准备媒体播放器引起的,如果你在本地播放音频文件,你没有准备媒体播放器,因为create()方法(如果你使用这个方法创建媒体播放器)自动准备。还有其他基于媒体播放器状态的错误,但下面的代码应该可以修复它们。

现在忽略搜索栏代码(我会在添加搜索栏功能之前让这个基本的播放、暂停和停止代码工作),播放、暂停和停止按钮的代码应该是这样的:

    public class MainActivity extends Activity {

    Button playb, pauseb, stopb;

    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Interface between code and xml
        playb = (Button) findViewById(R.id.play_button);
        stopb = (Button) findViewById(R.id.stop_button);
        pauseb = (Button) findViewById(R.id.pause_button);

        //Code for Play Button
        playb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.file_to_play.mp3);                
                mediaPlayer.start();

            }
        });


        //Code for Pause button
        pauseb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                } else {
                    mediaPlayer.start();
                }

            }
        });

        //code for Stop button
        stopb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                }
            }
        });
}