【问题标题】:How to display Song Duration如何显示歌曲时长
【发布时间】:2014-11-05 22:06:57
【问题描述】:

所以我使用 Mediastore 来获取歌曲持续时间,但我需要将它们转换为秒 我需要将它们格式化为 HH:MM:SS(Hours:Minutes:Seconds) 我尝试使用 TimeUnit 但没有用,或者我没有以正确的方式实现它

感谢您的帮助 对不起英语不好

请帮忙。 SongAdapter.java

@Override
public void bindView(View view, Context context, Cursor cursor) {




    TextView title1 = (TextView) view.findViewById(R.id.titlelist);
    TextView artist1 = (TextView) view.findViewById(R.id.artistlist);
    TextView duration1 = (TextView) view.findViewById(R.id.durationlist);
    ImageView album1 = (ImageView) view.findViewById(R.id.iconlist);

     title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
    String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
    String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
    String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
    long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
      StringBuilder titleBuild = new StringBuilder();

      titleBuild.append(title);

      if(titleBuild.length() > 35)
      {
      titleBuild.setLength(32);
      title = titleBuild.toString()+"...";
      }
      else
      {
          title = titleBuild.toString();
      }
      StringBuilder artistBuild = new StringBuilder();
      artistBuild.append(artist);
      if(artistBuild.length() > 35)
      {
      artistBuild.setLength(32);
      artist = artistBuild.toString()+"...";
      }
      else
      {
      artist = artistBuild.toString();
      }

      final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart");
        Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumId);

        if(albumArtUri == null){

            Picasso.with(context).load(R.drawable.default_artwork)
            .resize(300, 300).centerInside().into(album1);

        }


          Picasso.with(context).load(albumArtUri)
          .resize(300, 300).centerInside().into(album1);



duration1.setText(duration);          
title1.setText(title);
artist1.setText(artist);
}

【问题讨论】:

    标签: android duration mediastore


    【解决方案1】:

    一旦你有了持续时间,

    调用这个例程(但我相信还有更优雅的方法)。

    public String convertDuration(long duration) {
        String out = null;
        long hours=0;
        try {
            hours = (duration / 3600000);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return out;
        }
        long remaining_minutes = (duration - (hours * 3600000)) / 60000;
        String minutes = String.valueOf(remaining_minutes);
        if (minutes.equals(0)) {
            minutes = "00";
        }
        long remaining_seconds = (duration - (hours * 3600000) - (remaining_minutes * 60000));
        String seconds = String.valueOf(remaining_seconds);
        if (seconds.length() < 2) {
            seconds = "00";
        } else {
            seconds = seconds.substring(0, 2);
        }
    
        if (hours > 0) {
            out = hours + ":" + minutes + ":" + seconds;
        } else {
            out = minutes + ":" + seconds;
        }
    
        return out;
    
    }
    

    【讨论】:

    • 感谢您帮助解决了我的问题
    • 如果您认为我的解决方案还可以,请给我投赞成票。谢谢
    【解决方案2】:

    Theo 的回答非常好,它在两种状态下显示时间的因素:

    如果小时不大于 0,则只显示分钟和秒。

    这是一种相当整洁的方法,但正如他所说,它不是很优雅。

    您可以通过以下方式简化事情:

    //convert the song duration into string reading hours, mins seconds
    int dur = (int) song.get(position).getDuration();
    
    int hrs = (dur / 3600000);
    int mns = (dur / 60000) % 60000;
    int scs = dur % 60000 / 1000;
    
    String songTime = String.format("%02d:%02d:%02d", hrs,  mns, scs);
    

    这里你应该知道三件事:

    1. 持续时间以毫秒为单位存储; 1000 毫秒 = 1 秒
    2. % 的使用用于获取总和的余数,也就是 60,000 与值 dur 匹配的次数?
    3. 使用除以1000得到scs是得到以秒为单位的绝对值,而不是毫秒。

    如果您不想使用它,也许您更愿意使用:

    //convert the song duration into string reading hours, mins seconds
    int dur = (int) song.get(position).getDuration();
    
    int hrs = (dur / 3600000);
    int mns = (dur / 60000) % 60000;
    int scs = dur % 60000;
    
    NumberFormat formatter = new DecimalFormat("00");
    String seconds = formatter.format(scs);
    
    String songTime = String.format("%02d:%02d", hrs,  mns);
    String output = songTime + ":" + seconds;
    

    据我了解,Java 不喜欢毫秒数小于 3 位,因为它太小了,因此使用 %02d 不能很好地显示,这就是我将 scs 除以 1000 的原因。使用Numberformatter 强制数字值的格式只有您指定的长度,在本例中为00

    【讨论】:

      【解决方案3】:

      MediaPlayerMediaStore 类中获取时间

      设置文本如下(在 Kotlin 中)(在 Java 中使用 setText)

      songTimeFav?.text = String.format("%d:%d",
                      TimeUnit.MILLISECONDS.toMinutes(finalTime?.toLong() as Long),
                      TimeUnit.MILLISECONDS.toSeconds(finalTime?.toLong() as Long) -
                              TimeUnit.MINUTES.toSeconds(
                                      TimeUnit.MILLISECONDS.toMinutes(finalTime.toLong())))
      

      songTimeFav 是 TextView 的对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2019-06-29
        • 2018-06-11
        • 1970-01-01
        • 2012-12-17
        相关资源
        最近更新 更多