Click here to Skip to main content
15,881,882 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
How can I provide ending text view the song duration that gets an increment whenever it gets a new song, it is just showing the total duration of the first song it gets, for all the songs.


What I have tried:

package com.example.lec8;

import androidx.appcompat.app.AppCompatActivity;

import android.drm.DrmStore;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    int [] song_list = {R.raw.b,R.raw.k,R.raw.n};
    int c_pos = 0;
    Button foward,p,rewind,stop;
    TextView starting,ending;
    SeekBar sb;
    CountDownTimer t;
    MediaPlayer mp;
    private static int  sTime =0;
    private Handler hdlr = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        foward = findViewById(R.id.btfoward);
        rewind = findViewById(R.id.btrewind);
        stop = findViewById(R.id.btpause);
        p = findViewById(R.id.btplay);
        starting = findViewById(R.id.startduration);
        ending = findViewById(R.id.lastduration);
        sb = findViewById(R.id.skbar);
        mp = MediaPlayer.create(this, song_list[c_pos++]);
        mp.start();
        int s_duration = mp.getDuration();
        sTime = mp.getCurrentPosition();

        ending.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) s_duration), TimeUnit.MILLISECONDS.toSeconds((long) s_duration) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)s_duration))));

           
*/
            starting.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime),
                    TimeUnit.MILLISECONDS.toSeconds(sTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(sTime))));
            sb.setProgress(sTime);
            hdlr.postDelayed(UpdateSongTime, 100);

        sb.setMax(s_duration);
        t = new CountDownTimer(s_duration, 250) {
            @Override
            public void onTick(long millisUntilFinished) {
                sb.setProgress((mp.getCurrentPosition()));
            }
            @Override
            public void onFinish() {
                Toast.makeText(MainActivity.this, "Song Completed", Toast.LENGTH_SHORT).show();
            }
        };
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mp.seekTo(seekBar.getProgress());
            }
        });
        t.start();
        foward.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (c_pos <= 1) {
                    c_pos++;
                    mp.reset();
                    mp = MediaPlayer.create(getApplicationContext(), song_list[c_pos]);
                    mp.start();
                } else {
                    Toast.makeText(getApplicationContext(), "No more songs", Toast.LENGTH_LONG).show();
                }
            }
        });
        rewind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (c_pos >= 1) {
                    c_pos--;
                    mp.reset();
                    mp = MediaPlayer.create(getApplicationContext(), song_list[c_pos]);
                    mp.start();
                } else {
                    Toast.makeText(getApplicationContext(), "No more songs", Toast.LENGTH_LONG).show();
                }
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.pause();
                stop.setVisibility(Button.INVISIBLE);
                p.setVisibility(Button.VISIBLE);
            }
        });
        p.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
                p.setVisibility(Button.INVISIBLE);
                stop.setVisibility(Button.VISIBLE);
            }
        });
    }
    private Runnable UpdateSongTime = new Runnable() {
        @Override
        public void run() {
            sTime = mp.getCurrentPosition();
            starting.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime),
                    TimeUnit.MILLISECONDS.toSeconds(sTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(sTime))) );
            sb.setProgress(sTime);
            hdlr.postDelayed(this, 100);
        }
    };
}
Posted
Updated 17-Apr-21 22:19pm
Comments
Richard MacCutchan 18-Apr-21 7:26am    
Somewhere in that code (only you know where) you need to capture the length of the songs and add them to your total field.
David Crow 18-Apr-21 21:45pm    
Since you are getting the duration of each song in s_duration, how about just accumulating that value?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900