Android: как остановить медиаплеер нажатием кнопки - PullRequest
0 голосов
/ 29 марта 2011

У меня есть кнопка воспроизведения и остановки.Когда я запускаю следующие коды, кнопка Play работает хорошо.Но когда я нажимаю кнопку остановки, я получаю сообщение о принудительном закрытии.

Я новичок в android dev.Спасибо заранее!:)

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

    }
}

Мой код main.xml:

<?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>

Ответы [ 5 ]

2 голосов
/ 29 марта 2011

Сначала попробуйте без:

mHandler.post(new Runnable(){

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

}); 

и код для остановки игрока:

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

и, во-вторых, можете ли вы предоставить свои xml-файлы, чтобы мы могли проверить их и увидеть ошибки.

1 голос
/ 03 октября 2011

Вышеприведенный код изменяется в соответствии со следующим кодом и выводится в соответствии с вашими требованиями. Когда вы создаете медиаплеер через метод MediaPlayer.create (....), нет необходимости заново его готовить. После использования методов деблокирования или сброса они должны потребоваться для повторной инициализации источника данных.

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

    }
}
1 голос
/ 29 марта 2011

Поместите блок try catch следующим образом -

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

Если ваше устройство настроено на отладку приложений, установите точку останова в блоке catch и сообщите нам, что говорит исключение.Вы также можете использовать эмулятор для отладки.

0 голосов
/ 14 июня 2013
if(mPlayer != null){
 mPlayer.release();

}

0 голосов
/ 23 марта 2013

Вот мой код, протестирован и работает нормально:

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

}

}

...