Android 完成音频后,ProgressBar不会重置
这个问题我已经问了两次了,现在仍然没有用。任何帮助都会很棒 完成音频后,我的进度条不会重置,该进度条只会停留在最大蓝线。我以前问过一个问题,并让它工作,但现在只是停止工作,不知道为什么它没有。任何帮助都会很棒 我所要做的就是随机选择一个音频,然后播放一个,当播放完成后,你可以再次按play来播放随机选择的音频 这里是代码:Android 完成音频后,ProgressBar不会重置,android,audio,android-mediaplayer,android-progressbar,Android,Audio,Android Mediaplayer,Android Progressbar,这个问题我已经问了两次了,现在仍然没有用。任何帮助都会很棒 完成音频后,我的进度条不会重置,该进度条只会停留在最大蓝线。我以前问过一个问题,并让它工作,但现在只是停止工作,不知道为什么它没有。任何帮助都会很棒 我所要做的就是随机选择一个音频,然后播放一个,当播放完成后,你可以再次按play来播放随机选择的音频 这里是代码: public class player2 extends Activity implements Runnable { private MediaPlayer mp;
public class player2 extends Activity implements Runnable {
private MediaPlayer mp;
private ProgressBar progressBar;
private ImageButton pauseicon;
private final int NUM_SOUND_FILES = 3; //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****
private int mfile[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.player_2);
pauseicon = (ImageButton) findViewById(R.id.pauseicon);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
getActionBar().setDisplayHomeAsUpEnabled(true);
mfile[0] = R.raw.sound04; //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
mfile[1] = R.raw.sound05; //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
mfile[2] = R.raw.sound06;
// Listeners
/**
* Play button click event
* plays a song and changes button to pause image
* pauses a song and changes button to play image
* */
try{
mp = MediaPlayer.create(player2.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
mp.seekTo(0);
mp.start(); ;
progressBar.setVisibility(ProgressBar.VISIBLE);
progressBar.setProgress(0);
progressBar.setMax(100);
new Thread(this).start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
pauseicon.setImageResource(R.drawable.playicon);
}
});
pauseicon.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// No need to check if it is pauseicon
if(mp.isPlaying()){
mp.pause();
((ImageButton) v).setImageResource(R.drawable.playicon);
} else {
mp.start();
((ImageButton) v).setImageResource(R.drawable.pauseicon);
}}});
}
public void run() {
int currentPosition= 0;
int total = mp.getDuration();
while (mp!=null && currentPosition<=total) {
try {
Thread.sleep(1000);
currentPosition= mp.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
progressBar.setProgress(currentPosition);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
if (mp != null)
if(mp.isPlaying())
mp.stop();
mp.release();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed(){
if (mp != null){
if(mp.isPlaying())
mp.stop();
mp.release();
}
//there is no reason to call super.finish(); here
//call super.onBackPressed(); and it will finish that activity for you
super.onBackPressed();
}
}
公共类player2扩展活动实现可运行{
私人媒体播放器;
私人ProgressBar ProgressBar;
私人图像按钮暂停;
private final int NUM_SOUND_FILES=3;//****将其替换为您拥有的实际声音文件数*****
私有int mfile[]=新int[NUM_SOUND_FILES];
私有随机rnd=新随机();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.player_2);
pauseicon=(图像按钮)findViewById(R.id.pauseicon);
progressBar=(progressBar)findViewById(R.id.progressBar);
getActionBar().setDisplayHomeAsUpEnabled(true);
mfile[0]=R.raw.sound04;//****用声音文件的专有名称替换这些文件
mfile[1]=R.raw.sound05;//将声音文件放在项目的/res/raw/文件夹中*****
mfile[2]=R.raw.sound06;
//听众
/**
*播放按钮点击事件
*播放歌曲并更改按钮以暂停图像
*暂停歌曲并更改按钮以播放图像
* */
试一试{
mp=MediaPlayer.create(player2.this,mfile[rnd.nextInt(NUM_SOUND_FILES)];
希克托议员(0);
mp.start();
progressBar.setVisibility(progressBar.VISIBLE);
progressBar.setProgress(0);
设置最大进度条(100);
新线程(this.start();
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(非法状态){
e、 printStackTrace();
}
mp.setOnCompletionListener(新的OnCompletionListener(){
完成时的公共作废(MediaPlayer mp){
pauseicon.setImageResource(R.drawable.playcon);
}
});
setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//TODO自动生成的方法存根
//无需检查是否为PauseCon
if(mp.isPlaying()){
mp.pause();
((ImageButton)v.setImageResource(R.drawable.playcon);
}否则{
mp.start();
((ImageButton)v.setImageResource(R.drawable.pauseicon);
}}});
}
公开募捐{
int currentPosition=0;
int total=mp.getDuration();
虽然(mp!=null&¤tPosition我没有彻底检查所有代码,但快速一看,我猜您的线程(更新进度条)将在完成时停止,并且您再也不会启动它(即,当用户再次单击play时)。只需尝试在PauseCon.setOnClickListener中重新启动线程即可(播放完成时)。示例:
pauseicon.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(mp.isPlaying()) {
mp.pause();
((ImageButton) v).setImageResource(R.drawable.playicon);
} else {
mp.start();
((ImageButton) v).setImageResource(R.drawable.pauseicon);
// RESTART THE UPDATE THREAD //
new Thread(this).start();
}
}
});
编辑使用静态变量存储线程,以便可以从视图的onClick
方法重新启动线程:
// add this to your class as a member
static Thread progressThread = new Thread(this);
// add this to BOTH onCreate and onClick
progressThread.start();
如果这不起作用(我现在无法测试),您可以简单地保持线程运行,例如:
// flag to set when thread should be actively running
static boolean runThread = true;
// change your run method to something as follows
public void run() {
while ( runThread ) {
if ( mp != null && currentPosition <= total ) {
int currentPosition= 0;
int total = mp.getDuration();
try {
Thread.sleep(1000);
currentPosition= mp.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
progressBar.setProgress(currentPosition);
}
else
Thread.sleep(1000);
}
}
// then when you no longer need to update the progress bar set the flag to false,
// which will cause your thread to finish. this can go anywhere, depending on
// your needs
runThread = false;
//设置线程何时应处于活动运行状态的标志
静态布尔runThread=true;
//将您的跑步方法更改为以下内容
公开募捐{
while(运行线程){
如果(mp!=null&¤tPosition我得到这个错误,那么构造函数线程(new View.OnClickListener(){})是未定义的。但是感谢您的尝试,任何建议:)当然,这不会起作用……我的坏;)onClickonClick
实际上在视图
类中,而不是您的活动中。如果您使用新线程(player2.start();
。很抱歉造成混淆。现在获取此错误player2无法解析为变量。:SOkay,在创建期间将新创建的线程保存为静态变量可能是一个好主意,然后您可以在onClick
中再次启动它(无需重新创建它)。我将在答案中添加一些示例代码以进行说明。好的,非常感谢!我将在明天上午进行测试,看看会发生什么。