@[toc] 作业
音乐播放器
activity
package com.example.day1023_exe02;
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.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.day1023_exe02.Bean.Music;
import com.example.day1023_exe02.util.MusicUtils;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import static com.example.day1023_exe02.util.MusicUtils.order;
import static com.example.day1023_exe02.util.MusicUtils.single;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ImageView imageList;
private TextView tvTitleList;
private SeekBar seekList;
private Button listList;
private Button listLeft;
private Button listStart;
private Button listRight;
//定义一个游标
private int index = 0;
//定义一个布尔值来确定是否播放
private boolean isplay = false;
//定义一个集合
private List<Music> list;
//配置适配器
private MyAdapter adapter;
//定义一个播放器
private MediaPlayer player;
//定义一个定时器
private Timer timer;
//定义一个数来记录点击的条目
private int num = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
} else {
list = MusicUtils.getMusic(this);
}
player = new MediaPlayer();
//点击播放
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
play(position);
}
});
//上一曲
listLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
index--;
if (index < 0) {
index = list.size() - 1;
}
play(index);
}
});
//下一曲
listRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
//点击播放,图标切换
listStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果暂停播放
if (isplay) {
//取反
isplay = false;
//启动
player.start();
//图标切换
listStart.setBackgroundResource(R.drawable.playbar_btn_pause);
} else {
//取反
isplay = true;
//暂停
player.pause();
//图标切换
listStart.setBackgroundResource(R.drawable.playbar_btn_play);
}
}
});
//seekbar 实时跟进
seekList.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
player.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
//播放结束一首音乐
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
});
//播放异常时调用
player.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
next();
return false;
}
});
//播放模式
listList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupWindow window = new PopupWindow();
View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.window, null);
window.setContentView(inflate);
window.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
window.setWidth(300);
window.setOutsideTouchable(true);
window.showAsDropDown(tvTitleList, 0, -370);
//弹窗里的三个条目的点击事件
TextView textView_order = inflate.findViewById(R.id.order_play);
textView_order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num = order;
Toast.makeText(MainActivity.this, "顺序播放", Toast.LENGTH_SHORT).show();
}
});
TextView textView_random = inflate.findViewById(R.id.rando_play);
textView_random.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num = MusicUtils.random;
Toast.makeText(MainActivity.this, "随机播放", Toast.LENGTH_SHORT).show();
}
});
TextView textView_single = inflate.findViewById(R.id.single_play);
textView_single.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num = single;
Toast.makeText(MainActivity.this, "单曲循环", Toast.LENGTH_SHORT).show();
}
});
}
});
}
private void next() {
index++;
if (index > list.size() - 1) {
index = 0;
}
play(index);
}
private void play(int position) {
if(timer != null){
timer.cancel();
}
index = position;
//设置播放模式
switch (num){
case 0:
break;
case 1:
position = new Random().nextInt(list.size());
break;
case 2:
position = --index;
break;
}
try {
player.reset();
player.setDataSource(list.get(position).getData());
player.prepareAsync();
seekList.setMax(Integer.parseInt(list.get(position).getDuration()));
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
seekList.setProgress(player.getCurrentPosition());
}
}, 0, 1000);
final int finalPosition = position;
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
tvTitleList.setText(list.get(finalPosition).getTitle());
player.start();
}
});
listStart.setBackgroundResource(R.drawable.playbar_btn_pause);
isplay = false;
} catch (IOException e) {
e.printStackTrace();
}
}
private void initView() {
listView = (ListView) findViewById(R.id.listView);
imageList = (ImageView) findViewById(R.id.image_list);
tvTitleList = (TextView) findViewById(R.id.tv_title_list);
seekList = (SeekBar) findViewById(R.id.seek_list);
listList = (Button) findViewById(R.id.list_list);
listLeft = (Button) findViewById(R.id.list_left);
listStart = (Button) findViewById(R.id.list_start);
listRight = (Button) findViewById(R.id.list_right);
}
@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) {
list = MusicUtils.getMusic(this);
listView.setAdapter(new MyAdapter(list, this));
}
}
}
工具类
package com.example.day1023_exe02.util;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import com.example.day1023_exe02.Bean.Music;
import java.util.ArrayList;
import java.util.List;
public class MusicUtils {
public static int order = 0;
public static int random = 1;
public static int single = 2;
public static List<Music> getMusic(Context context){
List<Music> list = new ArrayList<>();
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
if(cursor != null){
while (cursor.moveToNext()){
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
int i = Integer.parseInt(duration);
Music music = new Music(title, artist, duration, data, size);
if(i > 60*1000){
list.add(music);
}
}
}
cursor.close();
return list;
}
}
布局
<?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=".MainActivity">
<ListView
android:layout_weight="8.5"
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"></ListView>
<RelativeLayout
android:layout_weight="1.5"
android:layout_width="match_parent"
android:layout_height="0dp">
<LinearLayout
android:background="#FFF"
android:id="@+id/linear0001"
android:layout_width="80dp"
android:orientation="vertical"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_list"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:background="#FFF"
android:id="@+id/linear0002"
android:orientation="vertical"
android:layout_toRightOf="@id/linear0001"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title_list"
android:layout_weight="2"
android:text=""
android:layout_width="match_parent"
android:layout_height="0dp" />
<SeekBar
android:id="@+id/seek_list"
android:layout_weight="3"
android:layout_width="match_parent"
android:layout_height="0dp" />
<LinearLayout
android:background="#FFF"
android:id="@+id/radio_G"
android:layout_weight="4"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="0dp">
<Button
android:background="@drawable/playbar_btn_playlist"
android:layout_weight="1"
android:id="@+id/list_list"
android:layout_width="0dp"
android:layout_height="match_parent" />
<Button
android:background="@drawable/playbar_btn_prev"
android:layout_weight="1"
android:id="@+id/list_left"
android:layout_width="0dp"
android:layout_height="match_parent" />
<Button
android:background="@drawable/playbar_btn_play"
android:layout_weight="1"
android:id="@+id/list_start"
android:layout_width="0dp"
android:layout_height="match_parent" />
<Button
android:background="@drawable/playbar_btn_next"
android:layout_weight="1"
android:id="@+id/list_right"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>