简单音乐播放器,上一曲下一曲,暂停
生活随笔
收集整理的這篇文章主要介紹了
简单音乐播放器,上一曲下一曲,暂停
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
非常簡單的一個音樂播放器,話不多說,直接上代碼。
首先,看看我們的實際效果圖,我這里文字嫌懶是直接命名的(小伙伴們不要學哦,可以在res里的string里賦值調用),先來看看layout的效果圖
隨便編寫的,有能力的小伙伴可以自行編寫哦
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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=".MainActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/linear1"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/gray"android:orientation="horizontal"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/ce_bian"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="-5dp"android:layout_centerVertical="true"android:layout_gravity="center"android:background="@drawable/ic_launche_music_cebian_foreground"android:textColor="@color/black"android:textSize="25dp" /><EditTextandroid:id="@+id/Editext"android:layout_width="275dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_toRightOf="@id/ce_bian"android:background="@drawable/search_border"android:gravity="center"android:hint="搜索"android:textColorHint="@color/black"android:textSize="12sp" /><Buttonandroid:layout_width="35dp"android:layout_height="35dp"android:layout_centerVertical="true"android:layout_marginLeft="15dp"android:layout_toRightOf="@id/Editext"android:background="@drawable/ic_launche_music_round" /></RelativeLayout></androidx.appcompat.widget.Toolbar><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/local_music_rv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/linear1" /><RelativeLayoutandroid:id="@+id/bottom_music"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentBottom="true"android:background="@drawable/backgroundground_bian"><ImageViewandroid:layout_width="wrap_content"android:layout_height="0.5dp" /><ImageViewandroid:id="@+id/local_music_bottom_tv_icon"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:background="@drawable/ic_launche_music_round"android:scaleType="center" /><TextViewandroid:id="@+id/local_music_bottom_tv_singer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:layout_toRightOf="@id/local_music_bottom_tv_song"android:ellipsize="end"android:maxEms="6"android:singleLine="true"android:textSize="16sp"android:textStyle="bold" /><TextViewandroid:id="@+id/local_music_bottom_tv_song"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="5dp"android:layout_marginTop="10dp"android:layout_toRightOf="@id/local_music_bottom_tv_icon"android:ellipsize="end"android:maxEms="6"android:singleLine="true"android:textSize="16sp"android:textStyle="bold" /><ImageViewandroid:id="@+id/local_music_bottom_iv_next"android:layout_width="55dp"android:layout_height="55dp"android:layout_alignParentRight="true"android:src="@drawable/ic_launche_music_next_foreground" /><ImageViewandroid:id="@+id/local_music_bottom_iv_play"android:layout_width="40dp"android:layout_height="55dp"android:layout_toLeftOf="@id/local_music_bottom_iv_next"android:src="@drawable/ic_launche_music_play_foreground" /><ImageViewandroid:id="@+id/local_music_bottom_iv_last"android:layout_width="55dp"android:layout_height="55dp"android:layout_toLeftOf="@id/local_music_bottom_iv_play"android:src="@drawable/ic_launche_music_last_foreground" /></RelativeLayout> </RelativeLayout>接下來到我們的代碼部分
先創建一個bean 用于我們獲取歌曲的參數
package com.example.myapplication.musci;public class LocalMusicBean {private String id;private String song;private String singer;private String album;private String duration;private String path;public LocalMusicBean(String id, String song, String singer, String album, String duration, String path) {this.id = id;this.song = song;this.singer = singer;this.album = album;this.duration = duration;this.path = path;}public LocalMusicBean() {}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSong() {return song;}public void setSong(String song) {this.song = song;}public String getSinger() {return singer;}public void setSinger(String singer) {this.singer = singer;}public String getAlbum() {return album;}public void setAlbum(String album) {this.album = album;}public String getDuration() {return duration;}public void setDuration(String duration) {this.duration = duration;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}}接著是music適配器
package com.example.myapplication.musci;import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView;import com.example.myapplication.R;import java.util.List;public class LocalMusciAdapter extends RecyclerView.Adapter<LocalMusciAdapter.LocalMusicViewHolder> {//聲明一個上下文內容承接private Context context;private List<LocalMusicBean> mDates;//創建點擊每一項列表的點擊函數OnItemClickListener onItemClickListener;public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public interface OnItemClickListener {public void OnItemClick(View view, int position);}public LocalMusciAdapter(Context context, List<LocalMusicBean> mDates) {this.context = context;this.mDates = mDates;}@NonNull@Overridepublic LocalMusicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_local_music, parent, false);LocalMusicViewHolder holder = new LocalMusicViewHolder(view);return holder;}@Overridepublic void onBindViewHolder(@NonNull LocalMusicViewHolder holder, int position) {LocalMusicBean musicBean = mDates.get(position);holder.idTv.setText(musicBean.getId());holder.songTv.setText(musicBean.getSong());holder.singTv.setText(musicBean.getSinger());holder.albumTv.setText(musicBean.getAlbum());holder.durationTv.setText(musicBean.getDuration());holder.itemView.setOnClickListener(view -> onItemClickListener.OnItemClick(view, position));}@Overridepublic int getItemCount() {return mDates.size();}class LocalMusicViewHolder extends RecyclerView.ViewHolder {TextView idTv, songTv, singTv, albumTv, durationTv;public LocalMusicViewHolder(@NonNull View itemView) {super(itemView);idTv = itemView.findViewById(R.id.item_local_music_num);songTv = itemView.findViewById(R.id.item_local_music_song);singTv = itemView.findViewById(R.id.item_local_music_singer);albumTv = itemView.findViewById(R.id.item_local_music_album);durationTv = itemView.findViewById(R.id.item_local_music_duration);}} }接著就是我們的mainActivity
package com.example.myapplication;import android.content.ContentResolver; import android.database.Cursor; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.ImageView; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import com.example.myapplication.musci.LocalMusciAdapter; import com.example.myapplication.musci.LocalMusicBean;import java.io.IOException; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {private TextView songTv, singerTv;private ImageView playIv, lastIv, nextIv;private RecyclerView musicRv;private List<LocalMusicBean> mDate;private LocalMusciAdapter adapter;MediaPlayer mediaPlayer;int currentPausePositionInSong = 0;private int currnetPlayPosition = -1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getSupportActionBar().hide();setContentView(R.layout.activity_main);initView();mDate = new ArrayList<>();mediaPlayer = new MediaPlayer();adapter = new LocalMusciAdapter(this, mDate);musicRv.setAdapter(adapter);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);musicRv.setLayoutManager(linearLayoutManager);loadLocalMusicData();setEvenClickListener();}private void setEvenClickListener() {adapter.setOnItemClickListener(new LocalMusciAdapter.OnItemClickListener() {@Overridepublic void OnItemClick(View view, int position) {currnetPlayPosition = position;playMusicPosition(position);}});}private void playMusicPosition(int position) {singerTv.setText(mDate.get(position).getSinger());songTv.setText(mDate.get(position).getSong());stopMusic();mediaPlayer.reset();try {mediaPlayer.setDataSource(mDate.get(position).getPath());playMusic();} catch (IOException e) {e.printStackTrace();}}private void playMusic() {if (mediaPlayer != null && !mediaPlayer.isPlaying()) {try {mediaPlayer.prepare();mediaPlayer.start();} catch (IOException e) {e.printStackTrace();}}playIv.setImageResource(R.drawable.ic_launche_music_pause_foreground);}private void stopMusic() {if (mediaPlayer != null) {currentPausePositionInSong = 0;mediaPlayer.pause();mediaPlayer.seekTo(0);mediaPlayer.stop();playIv.setImageResource(R.drawable.ic_launche_music_play_foreground);}}private void pauseMusic() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {currentPausePositionInSong = mediaPlayer.getCurrentPosition();mediaPlayer.pause();playIv.setImageResource(R.drawable.ic_launche_music_play_foreground);}}@Overrideprotected void onDestroy() {super.onDestroy();stopMusic();}private void loadLocalMusicData() {ContentResolver resolver = getContentResolver();Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;Cursor cursor = resolver.query(uri, null, null, null);int id = 0;while (cursor.moveToNext()) {String song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));String singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));id++;String sid = String.valueOf(id);String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");String time = sdf.format(new Date(duration));if (time.equals("00:00")) {id--;continue;} else {LocalMusicBean bean = new LocalMusicBean(sid, album, song, singer, time, path);mDate.add(bean);}}adapter.notifyDataSetChanged();}private void initView() {nextIv = findViewById(R.id.local_music_bottom_iv_next);lastIv = findViewById(R.id.local_music_bottom_iv_last);playIv = findViewById(R.id.local_music_bottom_iv_play);songTv = findViewById(R.id.local_music_bottom_tv_song);singerTv = findViewById(R.id.local_music_bottom_tv_singer);musicRv = findViewById(R.id.local_music_rv);nextIv.setOnClickListener(this);lastIv.setOnClickListener(this);playIv.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.local_music_bottom_iv_next:if (currnetPlayPosition == mDate.size() - 1) {currnetPlayPosition = 0;playMusicPosition(currnetPlayPosition);return;}currnetPlayPosition = currnetPlayPosition + 1;playMusicPosition(currnetPlayPosition);break;case R.id.local_music_bottom_iv_last:if (currnetPlayPosition == 0) {currnetPlayPosition = mDate.size() - 1;playMusicPosition(currnetPlayPosition);return;}currnetPlayPosition = currnetPlayPosition - 1;playMusicPosition(currnetPlayPosition);break;case R.id.local_music_bottom_iv_play:if (currnetPlayPosition == -1) {return;}if (mediaPlayer.isPlaying()) {pauseMusic();} else {playMusic();}break;}}有問題的小伙伴可以私信交流哦
總結
以上是生活随笔為你收集整理的简单音乐播放器,上一曲下一曲,暂停的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树一:邂逅入门篇
- 下一篇: 抖查查参数解析 【2023/03/29】