apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.example.music" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.music">
<!-- 读写SD卡的权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/a"
android:label="音乐播放器"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.music.MainActivity"> <ListView android:id="@+id/local_music_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="#bbb" android:dividerHeight="1dp"></ListView> <RelativeLayout android:background="#eee" android:layout_width="match_parent" android:layout_height="80dp" android:focusableInTouchMode="true" android:layout_alignParentBottom="true"> <ImageView android:id="@+id/local_music_iv" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:src="@mipmap/music_icon"/> <TextView android:id="@+id/local_music_song" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌名" android:singleLine="true" android:ellipsize="end" android:textSize="16sp" android:textStyle="bold" android:layout_toRightOf="@+id/local_music_iv" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> <TextView android:id="@+id/local_music_singer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌手名" android:textSize="12sp" android:layout_toRightOf="@+id/local_music_iv" android:layout_alignLeft="@+id/local_music_song" android:layout_below="@+id/local_music_song" android:layout_marginTop="5dp"/> <ImageView android:id="@+id/local_music_last" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/local_music_singer" android:layout_centerHorizontal="true" android:onClick="onClick" app:srcCompat="@mipmap/last" /> <ImageView android:id="@+id/local_music_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignTop="@+id/local_music_singer" android:layout_marginEnd="30dp" android:layout_marginRight="30dp" android:onClick="onClick" app:srcCompat="@mipmap/next" /> <ImageView android:id="@+id/local_music_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/local_music_singer" android:layout_marginEnd="40dp" android:layout_marginRight="50dp" android:onClick="onClick" android:layout_toLeftOf="@+id/local_music_next" android:layout_toStartOf="@+id/local_music_next" app:srcCompat="@mipmap/play" /> </RelativeLayout> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/item_music_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" android:textSize="24sp" android:textStyle="bold" android:layout_centerVertical="true"/> <TextView android:id="@+id/item_music_sing" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Henry" android:textSize="20sp" android:textStyle="bold" android:singleLine="true" android:ellipsize="end" android:layout_marginLeft="20dp" android:layout_toRightOf="@+id/item_music_id"/> <TextView android:id="@+id/item_music_singer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="浩宇" android:textSize="16sp" android:textColor="#888" android:layout_marginTop="10dp" android:layout_alignLeft="@+id/item_music_sing" android:layout_below="@+id/item_music_sing"/> <TextView android:id="@+id/line" android:layout_width="2dp" android:layout_height="20dp" android:background="#ccc" android:layout_toRightOf="@+id/item_music_singer" android:layout_alignTop="@+id/item_music_singer" android:layout_marginLeft="10dp" android:layout_marginRight="10dp"/> <TextView android:id="@+id/item_music_album" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="专辑名称" android:layout_marginTop="10dp" android:textSize="16sp" android:textColor="#888" android:ellipsize="end" android:singleLine="true" android:layout_toRightOf="@+id/line" android:layout_below="@+id/item_music_sing"/> <TextView android:id="@+id/item_music_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:layout_below="@+id/item_music_singer" android:text=" " android:layout_alignParentRight="true"/> </RelativeLayout>
package com.example.music; import android.content.ContentResolver; import android.database.Cursor; import android.media.MediaPlayer; import android.net.Uri; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView musicLV; private TextView songTv; private TextView singerTv; private ImageView lastIv; private ImageView nextIv; private ImageView playIv; private List<MusicInfo> mDatas; //获取ListView的数据源 private MusicAdapter adapter; private MediaPlayer mediaPlayer; // 暂停的位置 private int currentPauseLocation = 0; // 当前播放的音乐的位置 private int currentPlayPosition = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); musicLV = findViewById(R.id.local_music_lv); songTv = findViewById(R.id.local_music_song); singerTv = findViewById(R.id.local_music_singer); lastIv = findViewById(R.id.local_music_last); nextIv = findViewById(R.id.local_music_next); playIv = findViewById(R.id.local_music_play); mediaPlayer = new MediaPlayer(); //初始化媒体播放器对象 // 查找数据源 mDatas = new ArrayList<>(); // 获取适配器对象 adapter = new MusicAdapter(this,mDatas); // 设置适配器 musicLV.setAdapter(adapter); // 加载本地的音乐数据源 loadLocalMusic(); // 需求:点击每一条歌曲,能够自动播放音乐,所以就需要ListView设置监听器 musicLV.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 获取被点击了那一项的具体数据 MusicInfo musicInfo = mDatas.get(position); // 播放指定内容的音乐信息 playMusicInPosition(musicInfo); // 设置正在被点击播放的位置 currentPlayPosition = position; } }); } //播放制定信息 private void playMusicInPosition(MusicInfo musicInfo) { songTv.setText(musicInfo.getSongName()); //设置正在被播放的歌名 singerTv.setText(musicInfo.getSinger()); //设置正在被播放的歌手名 stopMusic(); // 播放音乐 mediaPlayer.reset(); //重置播放器 // 设置播放音乐的路径 try { mediaPlayer.setDataSource(musicInfo.getPath()); // 播放音乐 playMusic(); } catch (IOException e) { e.printStackTrace(); } } private void playMusic() { if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) { if (currentPauseLocation==0) { //重头开始播放 try { mediaPlayer.prepare(); //因为是本地的音乐,所以同步准备 mediaPlayer.start(); //播放音乐 } catch (IOException e) { e.printStackTrace(); } }else { mediaPlayer.seekTo(currentPauseLocation); mediaPlayer.start(); } playIv.setImageResource(R.mipmap.pause); } } //暂停 public void pauseMusic(){ if (mediaPlayer!=null&&mediaPlayer.isPlaying()) { // 获取歌曲暂停的位置 currentPauseLocation = mediaPlayer.getCurrentPosition(); Log.i("tag", "pauseMusic: ====="); mediaPlayer.pause(); playIv.setImageResource(R.mipmap.play); } } //停止音乐 public void stopMusic(){ if (mediaPlayer!=null) { currentPauseLocation = 0; mediaPlayer.pause(); //暂停音乐 mediaPlayer.seekTo(0); //将播放进度条挪动到最初的位置上 mediaPlayer.stop(); playIv.setImageResource(R.mipmap.pause); } } //加载本地音乐数据源的方法 private void loadLocalMusic() { // 1.获取ContentResolver对象 ContentResolver resolver = getContentResolver(); // 2.获取访问的URI路径 Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; // 3.查询指定的路径当中的内容,获取到Cursor对象 Cursor cursor = resolver.query(uri, null, null, null, null); // 4.遍历Cursor对象,获取音乐信息 int id = 0; while (cursor.moveToNext()) { // 获取歌曲名称 String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); // 获取歌手的名称 String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); // 获取专辑的名称 String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); // 获取歌曲的时间 04:30 long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); SimpleDateFormat sdf = new SimpleDateFormat("mm:ss"); String time = sdf.format(new Date(duration)); // 对于或得到的歌曲的id,进行自增 id++; // 获取音频的路径 String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); MusicInfo musicInfo = new MusicInfo(id, title, singer, time, album,path); mDatas.add(musicInfo); //添加数据到数据源当中 } // 数据源发生改变 ,提示adapter更新数据 adapter.notifyDataSetChanged(); } // 当activity失去焦点时,就停止音乐 @Override protected void onStop() { super.onStop(); stopMusic(); } public void onClick(View view) { switch (view.getId()) { case R.id.local_music_play: if (currentPlayPosition==-1) { Toast.makeText(this,"浩宇大人,请选择", Toast.LENGTH_SHORT).show(); return; } if (mediaPlayer.isPlaying()) { // 如果正在播放当中,就暂停播放 pauseMusic(); }else{ playMusic(); //播放音乐 } break; case R.id.local_music_last: break; case R.id.local_music_next: break; } } }
package com.example.music; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; /** * Created by 帅比浩宇 on 2018/2/2. */ public class MusicAdapter extends BaseAdapter { private Context context; private List<MusicInfo> mDatas; public MusicAdapter(Context context, List<MusicInfo> mDatas) { this.context = context; this.mDatas = mDatas; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView==null) { convertView = LayoutInflater.from(context).inflate(R.layout.item,null); holder = new ViewHolder(convertView); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } // 获取指定位置的数据源 MusicInfo info = mDatas.get(position); holder.idTv.setText(info.getId()+"");//转变String类型 holder.titleTv.setText(info.getSongName()); holder.singerTv.setText(info.getSinger()); holder.alubmTv.setText(info.getAlubm()); holder.timeTv.setText(info.getTime()); return convertView; } class ViewHolder{ TextView idTv,titleTv,singerTv,alubmTv,timeTv; public ViewHolder(View view){ idTv = (TextView) view.findViewById(R.id.item_music_id); titleTv = (TextView) view.findViewById(R.id.item_music_sing); singerTv = (TextView) view.findViewById(R.id.item_music_singer); alubmTv = (TextView) view.findViewById(R.id.item_music_album); timeTv = (TextView) view.findViewById(R.id.item_music_time); } } }
package com.example.music; /** * Created by 帅比浩宇 on 2018/2/2. */ public class MusicInfo { private int id; //歌曲id private String songName; //歌曲名称 private String singer; //歌手名称 private String time; //歌曲持续时间 private String alubm; //专辑名称 private String path; public MusicInfo(int id, String songName, String singer, String time, String alubm, String path) { this.id = id; this.songName = songName; this.singer = singer; this.time = time; this.alubm = alubm; this.path = path; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } @Override public String toString() { return "MusicInfo{" + "id=" + id + ", songName='" + songName + '\'' + ", singer='" + singer + '\'' + ", time='" + time + '\'' + ", alubm='" + alubm + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSongName() { return songName; } public void setSongName(String songName) { this.songName = songName; } public String getSinger() { return singer; } public void setSinger(String singer) { this.singer = singer; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getAlubm() { return alubm; } public void setAlubm(String alubm) { this.alubm = alubm; } public MusicInfo() { } public MusicInfo(int id, String songName, String singer, String time, String alubm) { this.id = id; this.songName = songName; this.singer = singer; this.time = time; this.alubm = alubm; } }