Android的:如何在某些毫秒为单位显示文本,而媒体(MP3)播放 [英] Android: How to display text in certain milliseconds while media (mp3) is playing

查看:175
本文介绍了Android的:如何在某些毫秒为单位显示文本,而媒体(MP3)播放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做一个的卡拉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)。

我是新来的Andr​​oid开发人员。提前谢谢了。 :)


感谢您的回复@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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆