【问题标题】:Error on Android Media playerAndroid 媒体播放器出错
【发布时间】:2017-01-27 07:44:54
【问题描述】:

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

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: 致命异常: main 进程:main.deviac.com.seekbar,PID:25242 java.lang.RuntimeException:无法启动活动 ComponentInfo{main.deviac.com.seekbar/main.deviac.com.seekbar.MainActivity}:java.lang.IllegalStateException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2452) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 在 android.app.ActivityThread.access$900(ActivityThread.java:154) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:152) 在 android.app.ActivityThread.main(ActivityThread.java:5497) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.IllegalStateException 在 android.media.MediaPlayer._prepare(本机方法) 在 android.media.MediaPlayer.prepare(MediaPlayer.java:1158) 在 main.deviac.com.seekbar.MainActivity.onCreate(MainActivity.java:42) 在 android.app.Activity.performCreate(Activity.java:6285) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 在 android.app.ActivityThread.access$900(ActivityThread.java:154) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:152) 在 android.app.ActivityThread.main(ActivityThread.java:5497) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 09-19 20:16:15.344 25242-25242/main.deviac.com.seekbar D/AppTracker: 应用事件: 崩溃 09-19 20:16:28.590 25409-25409/main.deviac.com.seekbar W/系统:类加载器引用未知路径:/data/app/main.deviac.com.seekbar-2/lib/arm64 09-19 20:16:28.669 25409-25409/main.deviac.com.seekbar W/系统:类加载器引用未知路径:/data/app/main.deviac.com.seekbar-2/lib/arm64

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

【问题讨论】:

  • 解决了您的问题? @Atharva Muley
  • 不,它仍然给出同样的错误。我尝试重建项目,但一切都是徒劳的!我也是 android 编程的新手@Vinoth Vino
  • 你有没有试过实现我在这里回答的代码@Atharva Muley
  • 是的,我尝试过创建方法,没有尝试过另一个@Vinoth Vino
  • 尝试 setDataSource 方法@Atharva Muley

标签: android android-mediaplayer illegalstateexception


【解决方案1】:

您必须将文件路径添加到您的媒体播放器。只需在您的媒体播放器类中调用静态方法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

【讨论】:

    【解决方案2】:

    欢迎使用 Android 的媒体播放器,或者我称之为“基于状态的地狱”。

    您最初的错误是由准备媒体播放器引起的,如果您在本地播放音频文件,则无需准备媒体播放器,因为 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();
                    }
                }
            });
    }
    

    【讨论】:

    • 同意,这个 Android 的媒体播放器包含一些非常糟糕的编码,特别是它完全无法处理 Java 和 Native 之间发生的错误。并且它会将某些内容放入缓存中,当您释放播放器时它不会清除这些内容。然后,您将被卡住,直到您重新启动应用程序并清除缓存。这是一条典型的错误消息,播放器进入了它无法理解的状态: E/MediaPlayer: Unknown message type 10000,在播放器反复尝试恢复但无法恢复时导致声音暂停。丑闻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多