读取音乐的外部类
package com.example.day18;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.MediaStore;
import java.util.ArrayList;
import java.util.List;
public class Music {
private static List<sing> list = new ArrayList<>();
public static List<sing> utile(Main2Activity main2Activity) {
ContentResolver contentResolver = main2Activity.getContentResolver();
Cursor query = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (query.moveToNext()) {
String tile = query.getString(query.getColumnIndex(MediaStore.Audio.Media.TITLE));
String name = query.getString(query.getColumnIndex(MediaStore.Audio.Media.ARTIST));
int duration = query.getInt(query.getColumnIndex(MediaStore.Audio.Media.DURATION));
String data = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DATA));
Long size = query.getLong(query.getColumnIndex(MediaStore.Audio.Media.SIZE));
if(size > 1000*800){
list.add(new sing(tile, name, duration, data, size));
}
}
query.close();
return list;
}
public static String formatTime(int time) {
if (time / 1000 % 60 < 10) {
return time / 1000 / 60 + ":0" + time / 1000 % 60;
} else {
return time / 1000 / 60 + ":" + time / 1000 % 60;
}
}
}
将获取的音乐集合填充到适配器
package com.example.day18;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
class MusicApdp extends BaseAdapter {
private List<sing> list = new ArrayList<>();
private Main2Activity main2;
private int i = 0;
public MusicApdp(Main2Activity main2Activity, List<sing> utile) {
list.addAll(utile);
main2 = main2Activity;
}
@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;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
VH vh;
if(convertView == null){
vh = new VH();
convertView = LayoutInflater.from(main2).inflate(R.layout.sing,null);
vh.textView = convertView.findViewById(R.id.bh);
vh.textView2 = convertView.findViewById(R.id.titles);
vh.textView3 = convertView.findViewById(R.id.name);
vh.textView4 = convertView.findViewById(R.id.tion);
convertView.setTag(vh);
}else{
vh = (VH) convertView.getTag();
}
vh.textView.setText(String.valueOf(i++));
vh.textView2.setText(list.get(position).getTilte());
vh.textView3.setText(list.get(position).getArtist());
int duration = list.get(position).getDuration();
String s = Music.formatTime(duration);
vh.textView4.setText(s);
return convertView;
}
class VH{
TextView textView;
TextView textView2;
TextView textView3;
TextView textView4;
}
}
音乐的实体类
package com.example.day18;
public class sing {
private String tilte;
private String artist;
private int duration;
private String data;
private Long size;
public sing(String tilte, String artist, int duration, String data, Long size) {
this.tilte = tilte;
this.artist = artist;
this.duration = duration;
this.data = data;
this.size = size;
}
public sing() {
}
public String getTilte() {
return tilte;
}
public void setTilte(String tilte) {
this.tilte = tilte;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Long getSize() {
return size;
}
public void setSize(Long size) {
this.size = size;
}
}
对应的音乐播放器逻辑代码
package com.example.day18;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
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 java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class Main2Activity extends AppCompatActivity {
private Button play;
private SeekBar jindu;
private ListView LV;
private Button next;
private Button proty;
private Button order;
private int post = -1;
private boolean first = false;
private boolean ord[] = {true,false,false,false};
private List<sing> utile = new ArrayList<>();
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
play = (Button) findViewById(R.id.play);
jindu = (SeekBar) findViewById(R.id.jindu);
LV = (ListView) findViewById(R.id.LV);
next = (Button) findViewById(R.id.next);
proty = (Button) findViewById(R.id.proty);
order = (Button) findViewById(R.id.order);
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
mediaPlayer = new MediaPlayer();
LV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
post = position;
String data = utile.get(position).getData();
stat(data);
}
});
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(first == false){
mediaPlayer.pause();
first = true;
play.setBackgroundResource(R.drawable.ic_action_play);
}else if (first == true){
mediaPlayer.start();
first = false;
play.setBackgroundResource(R.drawable.ic_action_pause);
}
if(first == false){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
jindu.setProgress(mediaPlayer.getCurrentPosition());
}
});
}
},0,1000);
}
}
});
jindu.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser){
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextmusic();
}
});
proty.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
upmusic();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.reset();
if(ord[2]){
String data = utile.get(post).getData();
stat(data);
}else{
nextmusic();
}
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
nextmusic();
return false;
}
});
order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ord[0]){
ord[0] = false;
ord[1] = true;
order.setBackgroundResource(R.drawable.ic_action_circle);
}
else if (ord[1]){
ord[1] = false;
ord[2] = true;
order.setBackgroundResource(R.drawable.ic_action_cycle);
}
else if (ord[2]){
ord[2] = false;
ord[3] = true;
order.setBackgroundResource(R.drawable.ic_action_randoms);
}
else if (ord[3]){
ord[3] = false;
ord[0] = true;
order.setBackgroundResource(R.drawable.ic_action_order);
}
}
});
}
private void upmusic() {
if(post != -1) {
if(ord[0]){
if (--post < 0) {
post = 0;
}
}else if(ord[1]){
if (--post < 0) {
post = utile.size()-1;
}
}else if(ord[2]){
if (--post < 0) {
post = utile.size()-1;
}
}else if(ord[3]){
int i = new Random().nextInt(utile.size());
post = i;
}
String data = utile.get(post).getData();
stat(data);
}
}
private void nextmusic() {
if(post != -1) {
if(ord[0]){
if (++post > utile.size() - 1) {
mediaPlayer.pause();
first = true;
play.setBackgroundResource(R.drawable.ic_action_play);
post--;
return;
}
}else if(ord[1]){
if (++post > utile.size() - 1) {
post = 0;
}
}else if(ord[2]){
if (++post > utile.size() - 1) {
post = 0;
}
}else if(ord[3]){
int i = new Random().nextInt(utile.size());
post = i;
}
String data = utile.get(post).getData();
stat(data);
}
}
private void stat(String data) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(data);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
jindu.setMax(mediaPlayer.getDuration());
mediaPlayer.start();
first = false;
if(first == false){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
jindu.setProgress(mediaPlayer.getCurrentPosition());
}
});
}
},0,1000);
}
play.setBackgroundResource(R.drawable.ic_action_pause);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
utile = Music.utile(this);
MusicApdp musicApdp = new MusicApdp(this, utile);
LV.setAdapter(musicApdp);
}
}
}
对应的音乐播放器的界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".Main2Activity">
<ListView
android:layout_width="match_parent"
android:layout_height="500dp"
android:id="@+id/LV">
</ListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical">
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/play"
android:layout_above="@id/jindu"
android:background="@drawable/ic_action_play"
android:layout_centerHorizontal="true"
/>
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/next"
android:layout_above="@id/jindu"
android:background="@drawable/ic_action_next"
android:layout_toRightOf="@id/play"
/>
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/proty"
android:layout_above="@id/jindu"
android:background="@drawable/ic_action_previous"
android:layout_toLeftOf="@id/play"
/>
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/order"
android:layout_above="@id/jindu"
android:layout_alignParentRight="true"
android:background="@drawable/ic_action_order"
/>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/header"
/>
<SeekBar
android:layout_width="match_parent"
android:layout_alignParentRight="true"
android:layout_height="wrap_content"
android:id="@+id/jindu"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
</LinearLayout>