音乐


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;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值