Android的:如何在某些毫秒为单位显示文本,而媒体(MP3)播放 [英] Android: How to display text in certain milliseconds while media (mp3) is playing
问题描述
我试图做一个的卡拉OK一样的应用的。 我要当某一毫秒来显示一个字或词。例如:
1148毫秒 - >打印尼古拉斯
1826毫秒 - >打印是
2766毫秒 - >打印老
...
***毫秒 - >显示***
这里是我的code:
包com.example.hellomedia;
进口java.io.IOException异常;
进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.os.Handler;
进口android.widget.TextView;
公共类HelloMedia延伸活动{
/ **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main); 最后的处理程序mHandler =新的处理程序();
最终的TextView电视=新的TextView(本); tv.setText(玩......);
的setContentView(电视); 最终的MediaPlayer MPLAYER = MediaPlayer.create(这一点,R.raw.nicholas);
最后弦乐字[] = {
尼古拉斯,// 0
是,// 1
老,// 2
比,// 3
罪,// 4
与,// 5
他,// 6
大胡子,// 7
可能,// 8
走出去,// 9
否,// 10
更白。// 11
}; 尝试{
MPLAYER prepare()。
}赶上(IllegalStateException异常五){
// TODO自动生成catch块
e.printStackTrace();
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
} mPlayer.start(); mHandler.post(新的Runnable(){
公共无效的run(){ //tv.setText([+ mPlayer.getCurrentPosition()+]);
如果(mPlayer.getCurrentPosition()== 1148){// 0
tv.append(字[0]);
}
如果(mPlayer.getCurrentPosition()== 1826){// 1
tv.append(字[1]);
}
如果(mPlayer.getCurrentPosition()== 2766){// 2
tv.append(字[2]);
}
mHandler.postDelayed(此,1);
}
});
}
}
当我运行这一点,正在打印没有从阵列字(S)。
我是新来的Android开发人员。提前谢谢了。 :)
感谢您的回复@Matthew威利斯,@MarvinLabs和@Bill莫特。我想出了正好与我所需要的。我的code是这样的:
包com.example.hellomedia;进口java.io.IOException异常;
进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.os.Handler;
进口android.widget.TextView;公共类HelloMedia延伸活动{/ **当第一次创建活动调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main); 最后的处理程序mHandler =新的处理程序();
最终的TextView电视=新的TextView(本); tv.setText(Playing1 ......);
的setContentView(电视); 最终的MediaPlayer MPLAYER = MediaPlayer.create(这一点,R.raw.nicholas); 尝试{
MPLAYER prepare()。
}赶上(IllegalStateException异常五){
// TODO自动生成catch块
e.printStackTrace();
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
} mPlayer.start();
最后弦乐字[] = {
尼古拉斯,// 0
是,// 1
老,// 2
比,// 3
罪,// 4
与,// 5
他,// 6
大胡子,// 7
可能,// 8
走出去,// 9
否,// 10
更白。// 11
}; 最终长startEndTime [] [] = {
{ //开始时间
1148,// 0,0
1826年,// 0,1
2766,// 0,2
3079,// 0,3
3549,// 0,4
4540,// 0,5
4697,// 0,6
4801,// 0.7
5114,// 0,8
5323,// 0,9
5532,// 0,10
5845 // 0,11
},
{ //时间结束
1357,// 1,0
2192,// 1,1
3027,// 1,2
3183,// 1,3
3966,// 1,4
4645,// 1,5
4749,// 1,6
4958,// 1,7
5219,// 1,8
5427,// 1,9
5740,// 1,10
6210 // 1,11
} }; mHandler.post(新的Runnable(){ 公共无效的run(){
最终长currentPos = mPlayer.getCurrentPosition(); INT X = 0; 而(X< 12){
如果(currentPos> startEndTime [0] [X]&放大器;&放大器; currentPos&下; startEndTime [1] [X]){// 0
tv.append(字[X]);
词语[X] =;
}
X ++;
} mHandler.postDelayed(此,1);
}
});
}
}
您没有guaranted你的消息处理程序将调用准确地每毫秒。你必须给它一些松弛:
mHandler =新的处理程序(){
公共无效的handleMessage(消息MSG){
最终长currentPos = mPlayer.getCurrentPosition(); 如果(currentPos> 1100安培;&安培; currentPos< 1300){
tv.append(字[0]);
}否则如果(currentPos> 1300安培;&安培; currentPos< 1400){
tv.append(字[1]);
} mHandler.sendEmptyMessageDelayed(0,1);
}
};
mHandler.sendEmptyMessage(0);
I'm trying to do a karaoke-like application. I want to display a word or words when a certain milliseconds come. For example:
1148 ms -> print "Nicholas "
1826 ms -> print "was "
2766 ms -> print "older "
...
*** ms -> display "*** "
Here's my code:
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.widget.TextView;
public class HelloMedia extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Handler mHandler = new Handler();
final TextView tv = new TextView(this);
tv.setText("Playing... ");
setContentView(tv);
final MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.nicholas);
final String words[] = {
"Nicholas ",// 0
"was ", // 1
"older ",// 2
"than ",// 3
"sin ",// 4
"and ",// 5
"his ",// 6
"beard ",// 7
"could ",// 8
"go ",// 9
"no ",// 10
"whiter. "// 11
};
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(){
//tv.setText(" [ " + mPlayer.getCurrentPosition() + " ] ");
if( mPlayer.getCurrentPosition() == 1148 ){//0
tv.append(words[0]);
}
if( mPlayer.getCurrentPosition() == 1826 ){//1
tv.append(words[1]);
}
if( mPlayer.getCurrentPosition() == 2766 ){//2
tv.append(words[2]);
}
mHandler.postDelayed(this, 1);
}
});
}
}
When I run this, no word(s) from the array is being printed.
I'm new to android dev. Many thanks in advance. :)
Thanks for all your responses @Matthew Willis, @MarvinLabs, and @Bill Mote. I came up exactly with what I needed. My code goes something like this:
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.widget.TextView;
public class HelloMedia extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Handler mHandler = new Handler();
final TextView tv = new TextView(this);
tv.setText("Playing1... ");
setContentView(tv);
final MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.nicholas);
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();
final String words[] = {
"Nicholas ",// 0
"was ", // 1
"older ",// 2
"than ",// 3
"sin ",// 4
"and ",// 5
"his ",// 6
"beard ",// 7
"could ",// 8
"go ",// 9
"no ",// 10
"whiter. "// 11
};
final long startEndTime[][]={
{ //start time
1148,// 0,0
1826, // 0,1
2766,// 0,2
3079,// 0,3
3549,// 0,4
4540,// 0,5
4697,// 0,6
4801,// 0,7
5114,// 0,8
5323,// 0,9
5532,// 0,10
5845// 0,11
},
{ //end time
1357,// 1,0
2192, // 1,1
3027,// 1,2
3183,// 1,3
3966,// 1,4
4645,// 1,5
4749,// 1,6
4958,// 1,7
5219,// 1,8
5427,// 1,9
5740,// 1,10
6210// 1,11
}
};
mHandler.post(new Runnable(){
public void run(){
final long currentPos = mPlayer.getCurrentPosition();
int x = 0;
while( x < 12){
if( currentPos > startEndTime[0][x] && currentPos < startEndTime[1][x] ){//0
tv.append(words[x]);
words[x]="";
}
x++;
}
mHandler.postDelayed(this, 1);
}
});
}
}
You are not guaranted that your message handler will be called exactly each millisecond. You must give it some slack:
mHandler = new Handler() {
public void handleMessage(Message msg){
final long currentPos = mPlayer.getCurrentPosition();
if (currentPos > 1100 && currentPos < 1300) {
tv.append(words[0]);
} else if (currentPos > 1300 && currentPos < 1400) {
tv.append(words[1]);
}
mHandler.sendEmptyMessageDelayed(0, 1);
}
};
mHandler.sendEmptyMessage(0);
这篇关于Android的:如何在某些毫秒为单位显示文本,而媒体(MP3)播放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!