【问题标题】:How to solve MediaPlayer IllegalStateException issue?如何解决 MediaPlayer IllegalStateException 问题?
【发布时间】:2014-02-24 20:33:34
【问题描述】:

我知道有很多关于这个主题的问题,但没有一个对我有帮助。我尝试了所有但没有,仍然在我的 logcat 和应用程序崩溃中收到 IllegalStateException。

这是我的 MainActivity.java:

package com.orar.cngcnasaud;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private ListView mDrawerList;
    private DrawerLayout mDrawer;
    private CustomActionBarDrawerToggle mDrawerToggle;
    private String[] menuItems;


    private static final String TAG = "AudioDemo";
    private static final String isPlaying = "Media is Playing"; 
    private static final String notPlaying = "Media has stopped Playing"; 

    MediaPlayer player;
    Button playerButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_drawer);

        player = MediaPlayer.create(this, R.raw.gc);
        player.setLooping(false); // Set looping

        // Get the button from the view
        playerButton = (Button) this.findViewById(R.id.buttonmp);
        playerButton.setText(R.string.stop_label);
        playerButton.setOnClickListener((OnClickListener) this);

        // Begin playing selected media
        demoPlay();

        // Release media instance to system
        player.release();


        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        // set a custom shadow that overlays the main content when the drawer
        // opens
        mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        _initMenu();
        mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
        mDrawer.setDrawerListener(mDrawerToggle);
    }

        public void onClick(View v) {
            Log.d(TAG, "onClick: " + v);
            if (v.getId() == R.id.buttonmp) {
                playPause();
            }

    }




    private void demoPause() {
        // TODO Auto-generated method stub
        player.pause();
        playerButton.setText(R.string.play_label);
        Toast.makeText(this, notPlaying, Toast.LENGTH_LONG).show();
        Log.d(TAG, notPlaying);
}

    private void playPause() {
        // TODO Auto-generated method stub
        if(player.isPlaying()) {
          demoPause();
        } else {
          demoPlay();
        }   
    }

    private void demoPlay() {
        // TODO Auto-generated method stub
        player.start();
        playerButton.setText(R.string.stop_label);
        Toast.makeText(this, isPlaying, Toast.LENGTH_LONG).show();
        Log.d(TAG, isPlaying);
}

这不是整个活动,我的活动也有一个滑动菜单,但这是我的 MediaPlayer 的代码.. 非常感谢!

L.E:

LOGCAT:

02-24 19:09:24.011: E/AndroidRuntime(1323): FATAL EXCEPTION: main
02-24 19:09:24.011: E/AndroidRuntime(1323): java.lang.IllegalStateException
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.media.MediaPlayer.isPlaying(Native Method)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at com.orar.cngcnasaud.MainActivity.playPause(MainActivity.java:90)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at com.orar.cngcnasaud.MainActivity.onClick(MainActivity.java:72)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.view.View.performClick(View.java:4204)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.view.View$PerformClick.run(View.java:17355)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.os.Handler.handleCallback(Handler.java:725)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.os.Looper.loop(Looper.java:137)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at android.app.ActivityThread.main(ActivityThread.java:5041)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at java.lang.reflect.Method.invokeNative(Native Method)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at java.lang.reflect.Method.invoke(Method.java:511)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-24 19:09:24.011: E/AndroidRuntime(1323):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 请同时发布 logcat --> 需要知道它在哪一行崩溃
  • 90 和 72 是行。我已经为 logcat 编辑了第一篇文章。
  • [SOLVED] 解决方案是?
  • 由 donfuxx 解决 .. 现在好吗?我没有 15 个代表可以提供 + .. 对此感到抱歉!
  • @user3348368 好吧,标记为已解决我实际上是指单击我的答案旁边的复选图标,而不是在标题中添加“已解决”。它不会花费你任何东西;-)

标签: android media-player


【解决方案1】:

这里:

 if(player.isPlaying()) {

您似乎在播放器尚未初始化时调用ìsPlaying() 方法。在这种情况下,此方法会抛出此 IllegalStateException。

我认为原因是在您的onCreate 中您实际上发布了(!)MediaPlayer,请参阅:

   // Release media instance to system
    player.release();

您最好使用Activity生命周期方法来管理发布您的MediaPlayer:

@Override
public void onPause() {
    player.stop();
    player.release();
    super.onPause();
}

@Override
public void onResume() {
    player = MediaPlayer.create(this, R.raw.gc);
    player.setLooping(false);
    player.start(); 
    super.onResume();
} 

【讨论】:

  • 就是这样..它正在工作,但唯一的问题是歌曲在应用程序启动时播放,而不是在按下按钮时播放..那么,我该如何更改它?
  • 您不想在应用启动时播放声音?好吧,然后从 onCreate 方法中删除这一行:// Begin playing selected media demoPlay();
【解决方案2】:

这听起来像是一个初始化问题。虽然我没有做大量的研究,这里有一个可能的重复:

java.lang.IllegalStateException in MediaPlayer.isplaying() method

这是另一个副本,也指向初始化:

android java.lang.IllegalStateException MediaPlayer.isPlaying

这是 MediaPlayer 上的开发文档,在调用 isPlaying() 之前说明您需要初始化播放器:

http://developer.android.com/reference/android/media/MediaPlayer.html#isPlaying()

【讨论】:

    【解决方案3】:

    donfuxx 完美回答。

    如果您不想在创建/重新加载 Activity 时启动声音,请删除 Onresume(); 中的 player.start

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2018-12-08
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多