Java Android Mediaplayer-基于seekbar进度更新textview中音频的运行时间

Java Android Mediaplayer-基于seekbar进度更新textview中音频的运行时间,java,android,textview,media-player,Java,Android,Textview,Media Player,使用Mediaplayer播放音频文件。 一切正常,但音频的运行时间需要在textview中更新 textview.setText(mediaplayer.getCurrentPosition()/100000.0).toString(); 这给出了双倍值,但如果结束时间超过一分钟,经过的时间为1分钟,则显示0:60。。。但是应该是1点 是否有其他方式根据seekbar进度显示经过的时间 谢谢。您可以将getCurrentPosition转换为日期,并使用日期格式设置输出字符串 Date d

使用Mediaplayer播放音频文件。

一切正常,但音频的运行时间需要在textview中更新

textview.setText(mediaplayer.getCurrentPosition()/100000.0).toString();
这给出了双倍值,但如果结束时间超过一分钟,经过的时间为1分钟,则显示0:60。。。但是应该是1点

是否有其他方式根据seekbar进度显示经过的时间


谢谢。

您可以将getCurrentPosition转换为日期,并使用日期格式设置输出字符串

Date d = new Date();
d.setTime(mediaplayer.getCurrentPosition());
private final SimpleDateFormat timeFormat = new SimpleDateFormat("HH.mm");
String time = timeFormat.format(d).toString();

您可以将getCurrentPosition转换为日期,并使用日期格式设置输出字符串

Date d = new Date();
d.setTime(mediaplayer.getCurrentPosition());
private final SimpleDateFormat timeFormat = new SimpleDateFormat("HH.mm");
String time = timeFormat.format(d).toString();

音乐示例应用程序有一个类:

/*尽量少用String.format(),因为它会创建
*每次调用新的格式化程序,这是非常低效的。
*重用现有的格式化程序使
*makeTimeString()。
*makeAlbumSongsLabel()也使用此格式化程序/StringBuilder
*/
私有静态StringBuilder sformaBuilder=新StringBuilder();
私有静态格式化程序sFormatter=新格式化程序(sformabuilder,Locale.getDefault());
私有静态最终对象[]sTimeArgs=新对象[5];
公共静态字符串makeTimeString(上下文上下文,长秒){
String durationformat=context.getString(
secs<3600?R.string.durationformatshort:R.string.durationformatlong);
/*提供多个参数,以便轻松更改格式
*通过修改xml。
*/
sFormatBuilder.setLength(0);
最终对象[]timeArgs=sTimeArgs;
timeArgs[0]=secs/3600;
timeArgs[1]=秒/60;
时间参数[2]=(秒/60)%60;
timeArgs[3]=秒;
timeArgs[4]=秒%60;
返回sformter.format(durationformat,timeArgs.toString();
}
你可以用它

但是,如果将getCurrentPosition()的结果除以1000,carlovv的解决方案也会起作用,因为该方法返回毫秒

这就是strings.xml中的内容

    <string translatable="false" name="durationformatshort">
    <xliff:g id="format">%2$d:%5$02d</xliff:g>
</string>
<string translatable="false" name="durationformatlong">
    <xliff:g id="format">%1$d:%3$02d:%5$02d</xliff:g>
</string>

%2$d:%5$02d
%1$d:%3$02d:%5$02d

音乐示例应用程序有一个类:

/*尽量少用String.format(),因为它会创建
*每次调用新的格式化程序,这是非常低效的。
*重用现有的格式化程序使
*makeTimeString()。
*makeAlbumSongsLabel()也使用此格式化程序/StringBuilder
*/
私有静态StringBuilder sformaBuilder=新StringBuilder();
私有静态格式化程序sFormatter=新格式化程序(sformabuilder,Locale.getDefault());
私有静态最终对象[]sTimeArgs=新对象[5];
公共静态字符串makeTimeString(上下文上下文,长秒){
String durationformat=context.getString(
secs<3600?R.string.durationformatshort:R.string.durationformatlong);
/*提供多个参数,以便轻松更改格式
*通过修改xml。
*/
sFormatBuilder.setLength(0);
最终对象[]timeArgs=sTimeArgs;
timeArgs[0]=secs/3600;
timeArgs[1]=秒/60;
时间参数[2]=(秒/60)%60;
timeArgs[3]=秒;
timeArgs[4]=秒%60;
返回sformter.format(durationformat,timeArgs.toString();
}
你可以用它

但是,如果将getCurrentPosition()的结果除以1000,carlovv的解决方案也会起作用,因为该方法返回毫秒

这就是strings.xml中的内容

    <string translatable="false" name="durationformatshort">
    <xliff:g id="format">%2$d:%5$02d</xliff:g>
</string>
<string translatable="false" name="durationformatlong">
    <xliff:g id="format">%1$d:%3$02d:%5$02d</xliff:g>
</string>

%2$d:%5$02d
%1$d:%3$02d:%5$02d

这很有效-答案摘自另一篇文章:

DateFormat适用于日期,不适用于时间间隔。因此,如果得到1秒的位置,数据格式将其解释为日期/时间在日历开始后1秒


private String getTimeString(long millis) {
    StringBuffer buf = new StringBuffer();

    int hours = millis / (1000*60*60);
    int minutes = ( millis % (1000*60*60) ) / (1000*60);
    int seconds = ( ( millis % (1000*60*60) ) % (1000*60) ) / 1000;

    buf
        .append(String.format("%02d", hours))
        .append(":")
        .append(String.format("%02d", minutes))
        .append(":")
        .append(tring.format("%02d", seconds));

    return buf.toString();
}
然后做一些类似的事情


totalTime.setText(getTimeString(duration));
currentTime.setText(getTimeString(position));

这很有效-答案取自另一篇文章:

DateFormat适用于日期,不适用于时间间隔。因此,如果得到1秒的位置,数据格式将其解释为日期/时间在日历开始后1秒


private String getTimeString(long millis) {
    StringBuffer buf = new StringBuffer();

    int hours = millis / (1000*60*60);
    int minutes = ( millis % (1000*60*60) ) / (1000*60);
    int seconds = ( ( millis % (1000*60*60) ) % (1000*60) ) / 1000;

    buf
        .append(String.format("%02d", hours))
        .append(":")
        .append(String.format("%02d", minutes))
        .append(":")
        .append(tring.format("%02d", seconds));

    return buf.toString();
}
然后做一些类似的事情


totalTime.setText(getTimeString(duration));
currentTime.setText(getTimeString(position));

谢谢你的回复。但它总是显示05:30。没用!!谢谢你的回复。但它总是显示05:30。没用!!谢谢你的回答。但是R.string.durationformatshort:R.string.durationformatlong中需要什么文本?我尝试了carlovv解决方案,但它只显示了05:30,我尝试了将getCurrentPosition()除以1000,但仍然不起作用!!谢谢你的回答。但是R.string.durationformatshort:R.string.durationformatlong中需要什么文本?我尝试了carlovv解决方案,但它只显示了05:30,我尝试了将getCurrentPosition()除以1000,但仍然不起作用!!从另一个帖子得到了答案。查看此链接以获取答案。从另一个帖子得到了答案。查看此链接以获取答案。