Search code examples
javaandroidxmlandroid-mediaplayer

Android music player is not playing selected song


I'm trying to build an app that has music playing functionality. When the app is launched it shows the list of songs and when you click on it the song title shows but the song does not play. Please how do I fix this. Here's my music.java file

public class Music extends ListActivity {

private static final int UPDATE_FREQUENCY = 500;
private static final int STEP_VALUE = 4000;

private MediaCursorAdapter mediaAdapter = null;
private TextView selelctedFile = null;
private SeekBar seekbar = null;
private MediaPlayer player = null;
private ImageButton playButton = null;
private ImageButton prevButton = null;
private ImageButton nextButton = null;
private ImageButton floatButton = null;
private ImageButton floatButton2 = null;

private boolean isStarted = true;
private String currentFile = "";
private boolean isMoveingSeekBar = false;

private final Handler handler = new Handler();

private final Runnable updatePositionRunnable = new Runnable() {
    public void run() {
        updatePosition();
    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_music);


    LinearLayout ms = (LinearLayout) findViewById(R.id.music_search);
    ms.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent Ms = new Intent(Music.this, Google.class);
            startActivity(Ms);
        }
    });

    LinearLayout mr = (LinearLayout) findViewById(R.id.music_read);
    mr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent Mr = new Intent(Music.this, Pdf.class);
            startActivity(Mr);
        }
    });


    selelctedFile = (TextView) findViewById(R.id.selectedfile);
    seekbar = (SeekBar) findViewById(R.id.seekbar);
    playButton = (ImageButton) findViewById(R.id.play);
    prevButton = (ImageButton) findViewById(R.id.prev);
    nextButton = (ImageButton) findViewById(R.id.next);

    player = new MediaPlayer();

    player.setOnCompletionListener(onCompletion);
    player.setOnErrorListener(onError);
    seekbar.setOnSeekBarChangeListener(seekBarChanged);

    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

    if (null != cursor) {
        cursor.moveToFirst();

        mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor);

        setListAdapter(mediaAdapter);

        playButton.setOnClickListener(onButtonClick);
        nextButton.setOnClickListener(onButtonClick);
        prevButton.setOnClickListener(onButtonClick);
    }

}

@Override
protected void onListItemClick(ListView list, View view, int position, long id) {
    super.onListItemClick(list, view, position, id);

    currentFile = (String) view.getTag();

    startPlay(currentFile);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    handler.removeCallbacks(updatePositionRunnable);
    player.stop();
    player.reset();
    player.release();

    player = null;
}

private void startPlay(String file) {
    Log.i("Selected: ", file);

    selelctedFile.setText(file);
    seekbar.setProgress(0);

    player.stop();
    player.reset();

    try {
        player.setDataSource(file);
        player.prepare();
        player.start();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    seekbar.setMax(player.getDuration());
    playButton.setImageResource(android.R.drawable.ic_media_pause);

    updatePosition();

    isStarted = true;
}

private void stopPlay() {
    player.stop();
    player.reset();
    playButton.setImageResource(android.R.drawable.ic_media_play);
    handler.removeCallbacks(updatePositionRunnable);
    seekbar.setProgress(0);

    isStarted = false;
}

private void updatePosition() {
    handler.removeCallbacks(updatePositionRunnable);

    seekbar.setProgress(player.getCurrentPosition());

    handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY);
}



private class MediaCursorAdapter extends SimpleCursorAdapter {

    public MediaCursorAdapter(Context context, int layout, Cursor c) {
        super(context, layout, c,
                new String[]{MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION},
                new int[]{R.id.displayname, R.id.title, R.id.duration});
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView title = (TextView) view.findViewById(R.id.title);
        TextView name = (TextView) view.findViewById(R.id.displayname);
        TextView duration = (TextView) view.findViewById(R.id.duration);

        name.setText(cursor.getString(
                cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)));

        title.setText(cursor.getString(
                cursor.getColumnIndex(MediaStore.MediaColumns.TITLE)));

        long durationInMs = Long.parseLong(cursor.getString(
                cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION)));

        double durationInMin = ((double) durationInMs / 1000.0) / 60.0;

        durationInMin = new BigDecimal(Double.toString(durationInMin)).setScale(2, BigDecimal.ROUND_UP).doubleValue();

        duration.setText("" + durationInMin);

        view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)));
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.listitem, parent, false);

        bindView(v, context, cursor);

        return v;
    }
}

private View.OnClickListener onButtonClick = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.play: {
                if (player.isPlaying()) {
                    handler.removeCallbacks(updatePositionRunnable);
                    player.pause();
                    playButton.setImageResource(android.R.drawable.ic_media_play);
                } else {
                    if (isStarted) {
                        player.start();
                        playButton.setImageResource(android.R.drawable.ic_media_pause);

                        updatePosition();
                    } else {
                        startPlay(currentFile);
                    }
                }

                break;
            }
            case R.id.next: {
                int seekto = player.getCurrentPosition() + STEP_VALUE;

                if (seekto > player.getDuration())
                    seekto = player.getDuration();

                player.pause();
                player.seekTo(seekto);
                player.start();

                break;
            }
            case R.id.prev: {
                int seekto = player.getCurrentPosition() - STEP_VALUE;

                if (seekto < 0)
                    seekto = 0;

                player.pause();
                player.seekTo(seekto);
                player.start();

                break;
            }
        }
    }
};

private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        stopPlay();
    }
};

private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() {

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {

        return false;
    }
};

private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        isMoveingSeekBar = false;
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        isMoveingSeekBar = true;
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (isMoveingSeekBar) {
            player.seekTo(progress);

            Log.i("OnSeekBarChangeListener", "onProgressChanged");
        }
    }
  };
}`

and my activity_music file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.android.beez.study13.Music">



 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#0a0b0e"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".Music">

        <ListView
            android:id="@android:id/list"
            android:background="#f0fffdfd"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:layout_weight="1.0" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="#f7262624"
            android:background="@android:drawable/screen_background_light"
            android:orientation="vertical"
            android:padding="10dip">

            <TextView
                android:id="@+id/selectedfile"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:ellipsize="middle"
                android:gravity="center_horizontal"
                android:singleLine="true"
                android:text="No file selected"
                android:textColor="@android:color/black" />

            <SeekBar
                android:id="@+id/seekbar"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:max="100"
                android:paddingBottom="10dip" />

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
              android:background="@android:drawable/screen_background_light"
                android:gravity="center"
                android:backgroundTint="#ca030b03"
                android:orientation="horizontal">

                <ImageButton
                    android:id="@+id/prev"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="#000"
                    android:src="@android:drawable/ic_media_previous" />

                <ImageButton
                    android:id="@+id/play"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@android:drawable/ic_media_play" />

                <ImageButton
                    android:id="@+id/next"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="#000"
                    android:src="@android:drawable/ic_media_next" />

            </LinearLayout>

         </LinearLayout>

        </LinearLayout>


       </LinearLayout>

     </LinearLayout>`

and my listitem.xml file

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <TextView
    android:id="@+id/displayname"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:textSize="18dip"
    android:textStyle="bold" />

  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1.0"
        android:ellipsize="end"
        android:singleLine="true"
        android:textSize="15dip" />

     <TextView
        android:id="@+id/duration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:gravity="right"
        android:singleLine="true"
        android:textSize="15dip" />
  </LinearLayout>


</LinearLayout>`

Solution

  • Assuming fault in your media player, Use prepareAsync() instead of just prepare(). Also you can try setting onPrepareListener on your media player as following:

    mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
    
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.start();
        }
    });
    

    To know why you need to set this listener, refer this link.

    Here you can find the difference between prepare() and prepareAsync()

    Hope this helps :)