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();
}
精彩评论