1

MediaPlayer は、電話がかかってきても一時停止しません。onStopを追加しましたが、動作しますが、アクションバーの戻るボタンまたは戻るボタンでアプリのメインメニューに移動しようとすると、クラッシュします。誰かが助けることができれば素晴らしいでしょう!初心者のみ

クラス

public class player1 extends Activity implements Runnable {


private  MediaPlayer mp;
private ProgressBar progressBar;
private ImageButton pauseicon;
private final int NUM_SOUND_FILES = 3;  //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****
private int mfile[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();
boolean flag = true;

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_1);
        pauseicon = (ImageButton) findViewById(R.id.pauseicon);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        getActionBar().setDisplayHomeAsUpEnabled(true);



        mfile[0] = R.raw.sound01;  //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
        mfile[1] = R.raw.sound02;  //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
        mfile[2] = R.raw.sound03;
        // Listeners
        /**
         * Play button click event
         * plays a song and changes button to pause image
         * pauses a song and changes button to play image
         * */


        try{
             mp = MediaPlayer.create(player1.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start(); ;         
             progressBar.setVisibility(ProgressBar.VISIBLE);
             progressBar.setProgress(0);
             progressBar.setMax(mp.getDuration());
             new Thread(this).start();

         } catch (IllegalArgumentException e) {
             e.printStackTrace();
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }


        mp.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                pauseicon.setImageResource(R.drawable.playicon);
              mp.seekTo(0);

            }
        });

        pauseicon.setOnClickListener(new View.OnClickListener() {

               public void onClick(View v) {
                  if(mp.isPlaying()) {
                     mp.pause();
                     ((ImageButton) v).setImageResource(R.drawable.playicon);
                  } else {
                     mp.start();
                     ((ImageButton) v).setImageResource(R.drawable.pauseicon);

                  }

               }
            });
   }
   static boolean runThread = true;
   public void run() {
        while ( runThread )  {
              int currentPosition=0;
              int total = mp.getDuration();
              if ( mp != null && currentPosition <= total )  {
              try {
                 Thread.sleep(1000);
                 currentPosition= mp.getCurrentPosition();
              } catch (InterruptedException e) {
                 return;
              } catch (Exception e) {
                 return;
              }            
              progressBar.setProgress(currentPosition);
           } else
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        runThread = false; 
    }
   @Override
   protected void onStop() {
       super.onStop();
       if (mp != null && mp.isPlaying()){
           mp.pause();
       }
   }


   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);


        if (mp != null)
        if(mp.isPlaying())
              mp.stop();

          mp.release();

            return true;
        default:
            return super.onOptionsItemSelected(item);

    }

       }
    @Override 
    public void onBackPressed(){
      if (mp != null){
          if(mp.isPlaying())
              mp.stop();

          mp.release();
      }

      //there is no reason to call super.finish(); here
      //call super.onBackPressed(); and it will finish that activity for you
      super.onBackPressed(); 
    }

    }

エラー

  09-12 14:52:49.755: E/AndroidRuntime(26104): FATAL EXCEPTION: main
  09-12 14:52:49.755: E/AndroidRuntime(26104): java.lang.RuntimeException: Unable to stop activity {com.apps.seconds/com.apps.seconds.player1}: java.lang.IllegalStateException
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3463)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3517)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread.access$1200(ActivityThread.java:141)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.os.Handler.dispatchMessage(Handler.java:99)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.os.Looper.loop(Looper.java:137)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread.main(ActivityThread.java:5103)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at java.lang.reflect.Method.invokeNative(Native Method)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at java.lang.reflect.Method.invoke(Method.java:525)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at dalvik.system.NativeStart.main(Native Method)
  09-12 14:52:49.755: E/AndroidRuntime(26104): Caused by: java.lang.IllegalStateException
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.media.MediaPlayer.isPlaying(Native Method)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at com.apps.seconds.player1.onStop(player1.java:154)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1212)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.Activity.performStop(Activity.java:5275)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3458)
  09-12 14:52:49.755: E/AndroidRuntime(26104):   ... 11 more
4

3 に答える 3

1

これを使用しないでください

  @Override 
    public void onBackPressed(){
      if (mp != null){
          if(mp.isPlaying())
              mp.stop();

          mp.release();
      }

再開時に使用して、音楽の再生を再開できます

protected void onResume()
    {   
        // TODO Auto-generated method stub
        super.onResume();
    }

アクティビティのライフサイクルを学習するか、ここで私の回答を参照する必要があります

于 2013-09-12T15:01:16.163 に答える
1

09-12 14:52:49.755: E/AndroidRuntime(26104): 原因: java.lang.IllegalStateException 09-12 14:52:49.755: E/AndroidRuntime(26104): android.media.MediaPlayer.isPlaying(Native方法)

IllegalStateExceptionバックを押してから呼び出すと、内部プレーヤーがすでに解放されているため、例外が発生isPlayingしました..

ここを参照

于 2013-09-12T15:05:17.093 に答える
0

ここにいくつかの説明があります: onPause() Android

または公式ウェブサイトには、非常に便利なイベントワークフローがあります

于 2013-09-12T15:00:07.730 に答える