主界面java代码
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private ListView ap2List;
private Button ep2ButtonStart;
private Button ep2ButtonNext;
private List<MyMusic> list;
private MediaPlayer mp;
private SeekBar sb;
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ap2List = (ListView) findViewById(R.id.ap2_list);
ep2ButtonStart = (Button) findViewById(R.id.ep2_button_start);
ep2ButtonNext = (Button) findViewById(R.id.ep2_button_next);
mp=new MediaPlayer();
sb=findViewById(R.id.ap2_seekBar);
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},102);
//点击条目播放相对应的音乐。
ap2List.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
index=position;
try {
nextMusic(position);
} catch (IOException e) {
e.printStackTrace();
}
}
});
//播放完毕自动切换下一首。
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
index++;
if( index>=list.size()){
index=0;
}
try {
nextMusic(index);
} catch (IOException e) {
e.printStackTrace();
}
}
});
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if( fromUser){
mp.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
//自定义方法,切换到下一首。
private void nextMusic(int position) throws IOException {
mp.reset();
mp.setDataSource(list.get(position).getData());
mp.prepareAsync();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
sb.setMax(Integer.parseInt(list.get(position).getDuration()));
Timer timer = new Timer();
//设置进度条进度
timer.schedule(new TimerTask() {
@Override
public void run() {
sb.setProgress(mp.getCurrentPosition());
}
},0,1000);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if( requestCode==102&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
list = MyRead.read(MainActivity.this);
Toast.makeText(this, "list.size"+list.size(), Toast.LENGTH_SHORT).show();
MyAdapter aaa = new MyAdapter(MainActivity.this, list);
ap2List.setAdapter(aaa);
}
}
public void click(View view) {
switch (view.getId()) {
case R.id.ep2_button_start:
try {
nextMusic(index);
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.ep2_button_next:
index++;
if( index>=list.size()){
index=0;
}
try {
nextMusic(index);
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.ep2_button_up:
index--;
if( index<0){
index=list.size()-1;
}
try {
nextMusic(index);
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.ep2_button_pause:
mp.pause();
break;
}
}
}
自定义适配器
package com.example.mp2;
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;
public class MyAdapter extends BaseAdapter {
private Context con;
private List<MyMusic> list;
public MyAdapter(Context con, List<MyMusic> list) {
this.con = con;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private MyId mi;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if( convertView==null){
convertView= LayoutInflater.from(con).inflate(R.layout.mylayout,null);
mi=new MyId();
mi.title=convertView.findViewById(R.id.myLayout_text_title);
mi.artist=convertView.findViewById(R.id.myLayout_text_artist);
mi.time=convertView.findViewById(R.id.myLayout_text_time);
convertView.setTag(mi);
}else{
mi= (MyId) convertView.getTag();
}
mi.title.setText(list.get(position).getTitle());
mi.artist.setText(list.get(position).getArtist());
int duration = Integer.parseInt(list.get(position).getDuration());
duration=duration/1000;
int minute=duration/60;
duration=duration%60;
mi.time.setText(minute+":"+duration);
return convertView;
}
class MyId{
private TextView title;
private TextView artist;
private TextView time;
}
}
自定义music类
package com.example.mp2;
public class MyMusic {
private String title;
private String artist;
private String duration;
private String data;
private String size;
@Override
public String toString() {
return "MyMusic{" +
"title='" + title + '\'' +
", artist='" + artist + '\'' +
", duration='" + duration + '\'' +
", data='" + data + '\'' +
", size='" + size + '\'' +
'}';
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
}
自定义工具类
实现了读取手机音乐的功能
package com.example.mp2;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MyRead {
public static List<MyMusic> read( Context con) {
List<MyMusic> list = new ArrayList<>();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
ContentResolver cr = con.getContentResolver();
String[] str = {MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.SIZE};
Cursor query = cr.query(uri, null, null, null, null);
if (query != null) {
while (query.moveToNext()) {
MyMusic mm = new MyMusic();
mm.setTitle(query.getString(query.getColumnIndex(MediaStore.Video.Media.TITLE)));
mm.setArtist(query.getString(query.getColumnIndex(MediaStore.Video.Media.ARTIST)));
mm.setDuration(query.getString(query.getColumnIndex(MediaStore.Video.Media.DURATION)));
mm.setData(query.getString(query.getColumnIndex(MediaStore.Audio.Media.DATA)));
mm.setSize(query.getString(query.getColumnIndex(MediaStore.Audio.Media.SIZE)));
Toast.makeText(con, "read6666:" + list.size(), Toast.LENGTH_SHORT).show();
list.add(mm);
}
query.close();
Toast.makeText(con, "read:" + list.size(), Toast.LENGTH_SHORT).show();
return list;
}
Toast.makeText(con, "read22:" + list.size(), Toast.LENGTH_SHORT).show();
return null;
}
}
API
MediaPlayer常用的方法:
void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
int getCurrentPosition() 获取当前播放的位置
int getAudioSessionId() 返回音频的session ID
int getDuration() 得到文件的时间
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void pause () 暂停
void start () 开始
void stop () 停止
void prepare() 同步的方式装载流媒体文件。
void prepareAsync() 异步的方式装载流媒体文件。
void reset() 重置MediaPlayer至未初始化状态。
void release () 回收流媒体资源。
void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
void setLooping(boolean looping) 设置是否单曲循环
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。
注意:reset方法是将数据清空。 release方法是将媒体对象回收掉