2014-04-11 23 views
2

我正在创建一个测验应用程序。在10到12个问题之后,Medvoice不会在正确或错误的问题后提出。我得到这个错误MediaPlayer(-19,0)和从设置缓存,启用name = sound_effects,值= 0。请指导我解决这个错误。谢谢Android MediaPlayer未经发布而完成


我正在使用此代码。声音可播放8到10次,然后声音消失。如果我们等待一段时间,并在一段时间后再次点击按钮,声音开始播放。它也在一段时间后崩溃。

package com.kids_fun; 

import java.util.Arrays; 
import java.util.Collections; 
import java.util.Random; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.os.Handler; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.view.Menu; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.RadioGroup.OnCheckedChangeListener; 
import android.widget.TextView; 
import android.widget.Toast; 

public class HardAddition extends Activity { 

RadioGroup options; 
RadioButton answer1,answer2, answer3; 

TextView Num1,Num2,Counter, Answer,check_answer1; 

int Result, z, Score=00; 

final Random rand= new Random();  

CountDownTimer timer1; 

Button Submit,Next; 

ImageView Image; 

MediaPlayer mp; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_hard__addition); 

    // Getting RadioButtons, TextViews 


    options=(RadioGroup)findViewById(R.id.Hard_Add_RdGrp); 
    answer1=(RadioButton)findViewById(R.id.Hard_Add_answer1); 
    answer2=(RadioButton)findViewById(R.id.Hard_Add_Answer2); 
    answer3=(RadioButton)findViewById(R.id.Hard_Add_Answer3); 

    Num1=(TextView)findViewById(R.id.Hard_Add_Num1_ID); 
    Num2=(TextView)findViewById(R.id.Hard_Add_Num2_ID); 
    Counter=(TextView)findViewById(R.id.Hard_Additon_Counter); 
    Answer=(TextView)findViewById(R.id.Hard_Additon_Answer); 
    check_answer1=(TextView)findViewById(R.id.Hard_Addition_checked_answer); 

    Image=(ImageView)findViewById(R.id.Hard_Addition_ImageView); 


    //Setting Timer 

    timer1 = new CountDownTimer(15000, 1000) { 
     public void onTick(long millisUntilFinished) { 
      Counter.setText("" 
        + formatTime(millisUntilFinished)); 


     } 

     private String formatTime(long millis) { 
      // TODO Auto-generated method stub 

      String output = "00"; 
      long seconds = millis/1000; 
      //long minutes = seconds/60; 

      seconds = seconds % 60; 
      //minutes = minutes % 60; 

      String secondsD = String.valueOf(seconds); 
      //String minutesD = String.valueOf(minutes); 

      if (seconds < 10) 
      { secondsD = "0" + seconds; 

      } 
      //if (minutes < 10) 
      // minutesD = "0" + minutes; 

      output =secondsD; 
      return output; 

     } 

     public void onFinish() { 
      Counter.setText(""); 
      //Counter_Dialog(); 
      CustomDialogClass cdd=new CustomDialogClass(HardAddition.this); 
      cdd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      cdd.show(); 
     } 
    }; 

    //Calling Method to generate Numbers Randomly 

    getRandom(); 

    // Starting Timer 

    timer1.start(); 



    options.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(RadioGroup arg0, int arg1) { 
      // TODO Auto-generated method stub 

      check_answer(); 
     } 
    }); 

    // Submit Button to check the answer 


    Submit=(Button)findViewById(R.id.Hrd_AddOK_Btn_ID);; 

    Submit.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 


      MediaPlayer mp=MediaPlayer.create(HardAddition.this, R.raw.tick); 
      mp.start(); 
      timer1.cancel(); 
      Submit.setVisibility(View.INVISIBLE); 

      //Calling Method which will check the answer defined below 

      isCorrect(); 

     } 
    }); 


} 


//Method to Generate Numbers Randomly 


public void getRandom() 
{ 
    int FirstNum= rand.nextInt((1000-500)+1)+500; 

    Num1.setText(String.valueOf(FirstNum)); 

    int SecondNum= rand.nextInt((5000-1000)+1)+1000; 

    Num2.setText(String.valueOf(SecondNum)); 

    int x= Integer.parseInt(Num1.getText().toString()); 
    int y= Integer.parseInt(Num2.getText().toString()); 

    Result=x+y; 

    answer2.setText(String.valueOf(Result)); 





    int option_value1; 

    do{ 

     option_value1 =rand.nextInt((2000-500)+1)+500; 

    } 
    while(option_value1==Result); 

    answer1.setText(String.valueOf(option_value1)); 

    int option_value2; 

    do{ 

     option_value2 =rand.nextInt((3000-1500)+1)+1500; 

    } 
    while(option_value2==Result); 

    answer3.setText(String.valueOf(option_value2)); 



    int a=Integer.parseInt(answer1.getText().toString()); 
    int b=Integer.parseInt(answer2.getText().toString()); 
    int c=Integer.parseInt(answer3.getText().toString()); 


    Integer[] options = {a, b , c }; 
    Collections.shuffle(Arrays.asList(options)); 

    // assign the value choice 

    a = options[0]; 
    b = options[1]; 
    c = options[2]; 



    answer1.setText(String.valueOf(a)); 
    answer2.setText(String.valueOf(b)); 
    answer3.setText(String.valueOf(c)); 


    } 

// Method to check the answer 

public void isCorrect() 
{ 


    if(answer1.isChecked()==false && answer2.isChecked()==false && answer3.isChecked()==false) 
     { 

     Toast.makeText(getApplicationContext(), "Please Select One Option", Toast.LENGTH_SHORT).show(); 
     Submit.setVisibility(View.VISIBLE);  
     } 

    else if(answer1.isChecked()) 
    { 
     Image.setVisibility(View.VISIBLE); 
     z=Integer.parseInt(answer1.getText().toString()); 
     if(z==Result) 
     { 
      //Displaying Image 

      Image.setBackgroundResource(R.drawable.a); 

      //Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.wow); 
      mp.start(); 

      //Increamenting Score 

      increamentscore(); 

      //Generating New Question 

      final Handler handler=new Handler(); 

        handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions(); 
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 

     } 
     else{ 

      //Displaying Image 

      Image.setBackgroundResource(R.drawable.r); 

      //Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.okay); 
      mp.start(); 

      final Handler handler=new Handler(); 

        handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions();   
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 


     } 

    } 

    else if(answer2.isChecked()) 
    { Image.setVisibility(View.VISIBLE); 
     z=Integer.parseInt(answer2.getText().toString()); 
     if(z==Result) 
     { 

      //Displaying Image    

      Image.setBackgroundResource(R.drawable.b); 

      //Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.wow); 
      mp.start(); 

      Increamenting Score 

      increamentscore(); 

      final Handler handler=new Handler(); 

        handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions(); 
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 

     } 
     else{ 
      //Displaying Image 

      Image.setBackgroundResource(R.drawable.r); 

      //Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.okay); 
      mp.start(); 

      final Handler handler=new Handler(); 

        handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions(); 
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 

     } 
    } 

    else if(answer3.isChecked()) 
    { 
     Image.setVisibility(View.VISIBLE); 
     z=Integer.parseInt(answer3.getText().toString()); 
     if(z==Result) 
     { 

      //Displaying Image 

      Image.setBackgroundResource(R.drawable.a); 

      // Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.wow); 
      mp.start(); 

      increamentscore(); 

      final Handler handler=new Handler(); 

       handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions(); 
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 


     } 
     else{ 

      //Displaying Image 

      Image.setBackgroundResource(R.drawable.r); 

      //Playing Sound 

      mp=MediaPlayer.create(HardAddition.this, R.raw.okay); 
      mp.start(); 

      final Handler handler=new Handler(); 

        handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        Questions();  
        answer1.setChecked(false); 
        answer2.setChecked(false); 
        answer3.setChecked(false); 
        mp.stop(); 
        mp.release(); 

       } 
      }, 3500); 

     } 

} 
} 

    public void Counter_Dialog() { 

    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    builder.setTitle("Time is Up !!!") 
      .setMessage(
        "Your Time is Up, Press Next to Move to the Next Question") 
      // .setIcon(android.R.drawable.ic_dialog_alert) 
      .setPositiveButton("Next", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
           int which) { 

          mp=MediaPlayer.create(getApplicationContext(), R.raw.tick); 
          mp.start(); 
          Questions(); 
          //timer1.start(); 
          answer1.setChecked(false); 
          answer2.setChecked(false); 
          answer3.setChecked(false); 

         } 
        }) 
      // .setNegativeButton("No", null) 
      .show(); 

} 


// Increamenting Score 

public int increamentscore() { 

    if(Score<99) 
    { 
     Score = Score + 1; 
     Answer.setText(String.valueOf(Score)); 

    } 

    else{ 

     Score=0; 
    } 


    return Score; 
} 




// Generating New Question 

public void Questions() { 

        Image.setVisibility(View.GONE); 
      getRandom(); 
      timer1.start(); 
      options.clearCheck(); 
      check_answer1.setText(String.valueOf("")); 
      Submit.setVisibility(View.VISIBLE); 

} 


// Checking the value of Checked Answer by the User 

public void check_answer() 
{ int y; 

    switch(options.getCheckedRadioButtonId()) 
    { 

case R.id.Hard_Add_answer1: 
    y=Integer.parseInt(answer1.getText().toString()); 
    check_answer1.setText(String.valueOf(y)); 
    break; 

case R.id.Hard_Add_Answer2: 
    y=Integer.parseInt(answer2.getText().toString()); 
    check_answer1.setText(String.valueOf(y)); 
break; 

case R.id.Hard_Add_Answer3: 
    y=Integer.parseInt(answer3.getText().toString()); 
    check_answer1.setText(String.valueOf(y)); 
    break; 

    } 

} 


// Dialog which will display on When Time is UP 

public class CustomDialogClass extends Dialog implementsandroid.view.View.OnClickListener 
{ 

public Activity c; 
public Dialog d; 


public CustomDialogClass(Activity a) { 
super(a); 
// TODO Auto-generated constructor stub 
this.c = a; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.dialog_box); 
Next = (Button) findViewById(R.id.dialog_Next); 
Next.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 
switch (v.getId()) { 
case R.id.dialog_Next: 
mp=MediaPlayer.create(getApplicationContext(), R.raw.tick); 
mp.start(); 
Questions(); 
    break; 
default: 
    break; 
} 
dismiss(); 
} 
} 




@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.hard__addition, menu); 
    return true; 
} 

} 

回答

3

错误MediaPlayer(-19,0)因为从同一个引用你只能调用18次。

完成时需要释放MediaPlayer;

MediaPlayer mp = new MediaPlayer(); 

mp.prepare(); 
mp.start(); 

mp.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      mp.release(); 

     } 
    }); 
+0

我正在使用mp.release();我在20到25个问题后仍面临同样的问题。语音消失问题 –

+0

我也用过mp.prepare()。按钮它比简单的mp.release()更糟糕。 –

+0

如果我们保持一段时间并再次点击按钮,它会开始播放声音。 –

相关问题