开发者

Android: How to stop media player onclick of a button

开发者 https://www.devze.com 2023-02-20 23:54 出处:网络
I have a play and stop button. When I run the following codes, Play button goes well. But when I click the stop button, I\'m getting a force close message.

I have a play and stop button. When I run the following codes, Play button goes well. But when I click the stop button, I'm getting a force close message.

I'm new to android dev. Many thanks in advance! :)

package com.example.hellomedia;

import java.io.IOException;


import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;

public class HelloMedia extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final MediaPlayer mPlayer = MediaPlayer.create(HelloMedia.this, R.raw.nicholas);

        setContentView(R.layout.main);

        final Handler mHandler = new Handler();

        final TextView customTextBG = (TextView) findViewById(R.id.customTextBG);
        final TextView customTextHL = (TextView) findViewById(R.id.customTextHL);

        customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
        customTextHL.setText("");

        final String words[] = {
                "Nicholas ", // 0
                "was... \n\n", // 1
                "Older ", // 2
                "than ", // 3
                "sin, ", // 4
        };

        final long startEndTime[][]={
                {   //start time
                    1148,// 0,0
                    1826, // 0,1
                    2766,// 0,2
                    3079,// 0,3
                    3549,// 0,4

                },
                {   //end time
                    1357,// 1,0
                    2192, // 1,1
                    3027,// 1,2
                    3183,// 1,3
                    3966,// 1,4
                }
            };



        customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
        customTextHL.setText("");




        View.OnClickListener handler = new View.OnClickListener(){
            public void onClick(View v) {

                switch (v.getId()) {
                    case R.id.widget30: // PLAY

                        if( !mPlayer.isPlaying() ){

                            try {
                                mPlayer.prepare();
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                    e.printStackTrace();
                            }

                            mPlayer.start();

                            mHandler.post(new Runnable(){

                                    public void run(){ 
                                    final long currentPos = mPlayer.getCurrentPosition();

                                        int x = 0;
                                        while( x < 102){
                                            if( currentPos > startEndTime[0][x] && currentPos < startEndTime[1][x] ){//0
                                            customTextHL.append(words[x]);
                                            words[x]="";
                                        }
                                        x++;
                          开发者_如何学编程          } mHandler.postDelayed(this, 1);
                                    }

                              });
                        }

                        break;

                    case R.id.widget31: // RESET

                        mHandler.post(new Runnable(){

                            public void run(){ 
                                customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
                                customTextHL.setText("");
                            }

                      });

                        mPlayer.stop();
                        mPlayer.release();

                        break;
                }
            }
        };

        // BUTTONS
        findViewById(R.id.widget30).setOnClickListener(handler); // PLAY
        findViewById(R.id.widget31).setOnClickListener(handler); // RESET

    }
}

My main.xml code:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/widget29"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TextView
android:textStyle="bold" 
android:id="@+id/customTextBG" 
android:textSize="18sp" 
android:text="@+id/customTextBG" 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/widget31"
android:layout_alignParentLeft="true"
>
</TextView>
<TextView
android:textStyle="bold" 
android:id="@+id/customTextHL" 
android:textSize="18sp" 
android:text="@+id/customTextHL" 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/widget31"
android:layout_alignParentLeft="true"
android:textColor="#00FF00"
>
</TextView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/widget30"
android:text="@string/reset" android:id="@+id/widget31">
</Button>
<Button
android:id="@+id/widget30"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:text="@string/play">
</Button>
</RelativeLayout>


First, try without:

mHandler.post(new Runnable(){

    public void run(){ 
        customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
        customTextHL.setText("");
    }

}); 

and code for stop player:

if(mPlayer.isPlaying())
{
    mPlayer.stop();
}

and second, can you provide your xmlfiles, then we can test it and see the errors.


Put a try catch block like this -

try { 
       mPlayer.stop();
       mPlayer.release(); 
  } catch(Exception ex) { 
     ex.printStackTrace() 
  }

If your device is set to debug applications put a breakpoint in the catch block and let us know what the exception says. You can also use the emulator to debug.


The Above code is modified as following code and gets output as per your requirement.When you are create a mediaplayer throuh MediaPlayer.create(....) Method ,no need to prepare again it. Once release or reset Methods are used,they should be required to re-intialize the datasource.

public class HelloMedia extends Activity {
   MediaPlayer mPlayer;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

             mPlayer = MediaPlayer.create(HelloMedia .this, R.raw.sleepaway);

        setContentView(R.layout.main);

        final Handler mHandler = new Handler();

        final TextView customTextBG = (TextView) findViewById(R.id.customTextBG);
        final TextView customTextHL = (TextView) findViewById(R.id.customTextHL);

        customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
        customTextHL.setText("");

        final String words[] = {
                "Nicholas ", // 0
                "was... \n\n", // 1
                "Older ", // 2
                "than ", // 3
                "sin, ", // 4
        };

        final long startEndTime[][]={
                {   //start time
                    1148,// 0,0
                    1826, // 0,1
                    2766,// 0,2
                    3079,// 0,3
                    3549,// 0,4

                },
                {   //end time
                    1357,// 1,0
                    2192, // 1,1
                    3027,// 1,2
                    3183,// 1,3
                    3966,// 1,4
                }
            };



        customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
        customTextHL.setText("");




        View.OnClickListener handler = new View.OnClickListener(){
            public void onClick(View v) {

                switch (v.getId()) {
                    case R.id.widget30: // PLAY
                        try{
                            if(mPlayer==null)
                                 mPlayer = MediaPlayer.create(HelloMedia .this, R.raw.sleepaway);
                        if( !mPlayer.isPlaying() )
                        {

                          if(!mPlayer.isPlaying())
                            mPlayer.start();

            mHandler.post(new Runnable(){

                             public void run(){ 
                                 if(mPlayer!=null)
                                 if(mPlayer.isPlaying()){
                                    final long currentPos = mPlayer.getCurrentPosition();
                                        int x = 0;
                                        while( x < 5){
                                            if( currentPos > startEndTime[0][x] && currentPos < startEndTime[1][x] ){//0
                                            customTextHL.append(words[x]);
                                            words[x]="";
                                        }
                                        x++;
                                    } mHandler.postDelayed(this, 1);
                                    }

                             }});
                        }
                        }catch (Exception e) {
                            e.printStackTrace();
                            // TODO: handle exception
                        }

                        break;

                    case R.id.widget31: // RESET

                        mHandler.post(new Runnable(){

                            public void run(){ 
                                customTextBG.setText("Nicholas was… \n\nOlder than sin, ");
                                customTextHL.setText("");
                            }

                      });

                        try{
                        if(mPlayer.isPlaying())
                        {
                              mPlayer.stop();
                              mPlayer.reset();
                              mPlayer=null;
                        }
                        }catch (Exception e) {

                            e.printStackTrace();
                            // TODO: handle exception
                        }


                        break;
                }
            }
        };

        // BUTTONS
        findViewById(R.id.widget30).setOnClickListener(handler); // PLAY
        findViewById(R.id.widget31).setOnClickListener(handler); // RESET

    }
}


Here's my code, tested and working fine:

package com.example.com.mak.mediaplayer;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MediaPlayer mpp;
mpp=MediaPlayer.create(this,R.raw.red); //mp3 file in res/raw folder
    Button btnplay=(Button)findViewById(R.id.btnplay); //Play
        btnplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View vone) {
                mpp.start();}
        });
    Button btnpause=(Button)findViewById(R.id.btnpause); //Pause
        btnpause.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View vtwo) {
                if(mpp.isPlaying())
                {
        mpp.pause();
        mpp.seekTo(0);
                }
            }
        });

}

}


if(mPlayer != null){
 mPlayer.release();

}

0

精彩评论

暂无评论...
验证码 换一张
取 消