2011-03-29 127 views
0

我有一个播放和停止按钮。当我运行以下代码时,播放按钮顺利。但是当我点击停止按钮时,我正在收到一条强制关闭消息。Android:如何停止媒体播放器onclick按钮

我是新来的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> 
+0

你能提供一个错误信息?通过使用调试桥(adb)或通过在仿真器中运行程序。 – 2011-03-29 09:08:18

+0

我在桌面PC上运行它,我怎么看到错误信息?我没有使用模拟器,它有点慢... – Kris 2011-03-29 09:13:59

+0

本页面以一种很好且简单的方式解释adb:http://developer.android.com/guide/developing/tools/adb.html – 2011-03-29 09:22:19

回答

2

首先,尝试无:

mHandler.post(new Runnable(){ 

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

}); 

和停止播放器代码:

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

和第二,可以你提供你的xmlfiles,然后我们可以测试它并查看错误。

+0

感谢您的回应。你现在可以在这个问题上看到我的main.xml代码。我没有这些代码尝试过。我得到了同样的强制关闭信息。 – Kris 2011-03-29 09:44:59

+0

第一个错误我有什么03-29 10:04:13.227:ERROR/AndroidRuntime(907):java.lang.ArrayIndexOutOfBoundsException 。当我修复它(删除我)下一个错误是停止后“mPlayer.release()”我评论它 - 并没有问题。希望这是帮助你 – Peter 2011-03-29 10:08:34

+0

谢谢你试用它的人!但我可以问你删除了哪部分?你评论过“mPlayer.release()”代码就是你的意思。 – Kris 2011-03-29 10:15:19

1

把一个try catch块这样的 -

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

如果您的设备设置为调试应用程序放在catch块一个断点,并让我们知道除了说什么。您也可以使用模拟器进行调试。

+0

如何查看运行时错误? – Kris 2011-03-29 10:07:07

+1

它是alert的类:public警告无效(字符串消息){ \t新AlertDialog.Builder(本) \t \t .setMessage(消息) \t \t .setTitle( “警告!!!”) \t \t .setCancelable(TR UE) \t .setNeutralButton(android.R.string.ok, \t新DialogInterface.OnClickListener(){ 公共无效的onClick(DialogInterface对话框,整数whichButton){}} ).show(); (catch)(IOException e){alert(“”+ e);} catch(IOException e){alert(“”+ e);}并比如果你有崩溃的错误 - 警报可以显示此错误..这是如果你看不到logcat – Peter 2011-03-29 10:15:21

+0

@Peter如果mPlayer.Release()不会被调用不会是一个内存泄漏。也应mplayer设置为在调用release之后为null,否则当你下次使用它时会抛出异常。 – Salil 2011-03-29 10:29:34

1

上面的代码被修改为以下代码并根据您的需求获取输出。当您通过MediaPlayer.create(....)方法创建mediaplayer时,无需再次准备它。一旦使用释放或重置方法,应该要求重新初始化数据源。

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 

    } 
} 
0

这里是我的代码,测试,工作正常:

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

} 

}

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

}