Android音乐播放器没有播放选定的歌曲

时间:2022-01-02 21:26:12

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

我正在尝试建立一个有音乐播放功能的应用程序。当应用程序启动时,它会显示歌曲列表,当你点击它时,歌曲标题会显示出来,但歌曲不会播放。请告诉我怎么修复这个。这是我的音乐。java文件

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

和我activity_music文件

<?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文件

 <?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>`

2 个解决方案

#1


3  

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

假设您的媒体播放器有问题,使用prepareAsync()而不是准备()。您也可以尝试在您的媒体播放器上设置onPrepareListener,如下所示:

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()

这里您可以找到prepare()和prepareAsync()之间的区别

Hope this helps :)

希望这有助于:)

#2


1  

Use the mediaplayer like i have mentioned below it takes mediaplayer sometime to load the music content to play.

使用mediaplayer,就像我在下面提到的,它需要mediaplayer加载音乐内容的时间。

Let me know if any issues.

如果有什么问题,请告诉我。

    private MediaPlayer mMediaPlayer = mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setOnPreparedListener(mPreparedListener);
    mMediaPlayer.setDataSource(file);
    mMediaPlayer.prepareAsync();

    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            mMediaPlayer.start();

        }
    };

#1


3  

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

假设您的媒体播放器有问题,使用prepareAsync()而不是准备()。您也可以尝试在您的媒体播放器上设置onPrepareListener,如下所示:

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()

这里您可以找到prepare()和prepareAsync()之间的区别

Hope this helps :)

希望这有助于:)

#2


1  

Use the mediaplayer like i have mentioned below it takes mediaplayer sometime to load the music content to play.

使用mediaplayer,就像我在下面提到的,它需要mediaplayer加载音乐内容的时间。

Let me know if any issues.

如果有什么问题,请告诉我。

    private MediaPlayer mMediaPlayer = mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setOnPreparedListener(mPreparedListener);
    mMediaPlayer.setDataSource(file);
    mMediaPlayer.prepareAsync();

    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            mMediaPlayer.start();

        }
    };