Android: How to stop media player onclick of a button

戏子无情 提交于 2019-12-12 02:07:36

问题


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>

回答1:


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.




回答2:


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.




回答3:


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);
                }
            }
        });

}

}




回答4:


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

}



来源:https://stackoverflow.com/questions/5470068/android-how-to-stop-media-player-onclick-of-a-button

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!