使用MediaPlayer+Service完成音乐播放器
-
1,先把歌曲封装成一个类
-
2,封装查询本地歌曲的工具类
-
3 ,封装一个adapter类
-
4, adapter中的布局
-
5,服务中的所有代码
-
6 Activity中的布局.
-
7 Activity中的代码 8 清单文件
-
1,先把歌曲封装成一个类
public class ServersMuctic {
private String name;
private String singer;
private String time;
private String adress;
private String size;
private int position;public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public ServersMuctic(String name, String singer, String time, String adress, String size) { this.name = name; this.singer = singer; this.time = time; this.adress = adress; this.size = size; } public ServersMuctic(String name, String singer, String time, String adress) { this.name = name; this.singer = singer; this.time = time; this.adress = adress; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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 getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public ServersMuctic(String name, String singer, String time) { this.name = name; this.singer = singer; this.time = time; } public ServersMuctic() { }
}
2,封装查询本地歌曲的工具类public class MusicUtils{ private static final String TAG = "哇咔咔"; public static List<ServersMuctic> MusicUtils(Context context){ List<ServersMuctic> list=new ArrayList<>(); int i=0; Cursor cursor=context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null); Log.i(TAG, "MusicUtils: 你好我是服务端"); if(cursor!=null){ while (cursor.moveToNext()){ ServersMuctic serversMuctic=new ServersMuctic(); serversMuctic.setName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE))); serversMuctic.setSinger(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST))); serversMuctic.setTime(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION))); serversMuctic.setAdress(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE))); serversMuctic.setSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE))); serversMuctic.setPosition(i); i++; list.add(serversMuctic); } cursor.close(); }else{ Toast.makeText(context,"找不到文件",Toast.LENGTH_SHORT).show(); Log.i(TAG, "MusicUtils: 没有"); } return list; } }
3 ,封装一个adapter类
public class MyAdapter extends BaseAdapter {
private Context context;
private List list;
private LayoutInflater layoutInflater;public MyAdapter(Context context, List<ServersMuctic> list) { this.context = context; this.list = list; layoutInflater=LayoutInflater.from(context); } @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) { ViewHolder holder; if(convertView==null){ holder=new ViewHolder(); convertView=layoutInflater.inflate(R.layout.list,parent,false); holder.text1=convertView.findViewById(R.id.text1); holder.text2=convertView.findViewById(R.id.text2); holder.text3=convertView.findViewById(R.id.text3); convertView.setTag(holder); }else{ holder=(ViewHolder)convertView.getTag(); } holder.text1.setText(list.get(position).getName()); holder.text2.setText(list.get(position).getSinger()); holder.text3.setText(list.get(position).getTime()); return convertView; } class ViewHolder{ private TextView text1; private TextView text2; private TextView text3; }
}
4, adapter中的布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名"
android:textSize="25sp"/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌手"
android:layout_below="@id/text1"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/text2"/>
</RelativeLayout>
5,服务中的所有代码
public class MyServices extends Service {
private static final String TAG = "哈哈哈";
private MediaPlayer mediaPlayer;
private List<ServersMuctic> list;
int index;
public MyServices() {
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer=new MediaPlayer();
list=MusicUtils.MusicUtils(this);
}
public class MusicBinder extends Binder{
public void callPlay(int position){
playSong(position);
index=position;
}
public void callPause(){
pause();
}
public void callPlayNextSong(){
if(++index>list.size()-1){
index=0;
}
playSong(index);
}
public void callPlayNavSong(){
playSong(index);
}
public void callRestart(){
restart();
}
}
private void restart() {
mediaPlayer.start();
}
private void pause() {
if(mediaPlayer.isPlaying()){}
mediaPlayer.pause();
}
private void playSong(int position) {
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
mediaPlayer.reset();
ServersMuctic serversMuctic=list.get(position);
try {
mediaPlayer.setDataSource(serversMuctic.getAdress());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private void playNextSong(int position) {
Log.i(TAG, "playNextSong: "+position);
Log.i(TAG, "size: "+list.size());
playSong(position);
}
private void playNavSong() {
if (index <= 0){
index = 0;
}
playSong(index);
}
@Override
public IBinder onBind(Intent intent) {
return new MusicBinder();
}
}
6 Activity中的布局.
<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=".MainActivity">
<LinearLayout
android:id="@+id/line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true">
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="privice"
app:srcCompat="@android:drawable/ic_media_previous" />
<ImageButton
android:id="@+id/imageButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="stop"
app:srcCompat="@android:drawable/ic_media_pause" />
<ImageButton
android:id="@+id/imageButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="next"
app:srcCompat="@android:drawable/ic_media_next" />
</LinearLayout>
<LinearLayout
android:id="@+id/line2"
android:layout_above="@id/line"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/line2"></ListView>
</RelativeLayout>
7 Activity中的代码
public class MainActivity extends AppCompatActivity {
private static final String TAG = "哎嘿嘿";
private ImageButton imageButton1;
private ImageButton imageButton2;
private ImageButton imageButton4;
private SeekBar seekBar;
private ListView listView;
private MediaPlayer mediaPlayer;
private MyAdapter myAdapter;
private List<ServersMuctic> list;
private ContentResolver contentResolver;
private Uri uri;
private int a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageButton1 = findViewById(R.id.imageButton1);
imageButton2 = findViewById(R.id.imageButton2);
imageButton4 = findViewById(R.id.imageButton4);
seekBar = findViewById(R.id.seekBar);
listView = findViewById(R.id.listView);
list=new ArrayList<>();
myAdapter=new MyAdapter(this,list);
listView.setAdapter(myAdapter);
mediaPlayer=new MediaPlayer();
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
}else{
method();
}
seekBar.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) {
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
a=position;
sb(a);
}
});
}
private void sb(int a) {
try {
mediaPlayer.reset();
seekBar.setProgress(0);
mediaPlayer.setDataSource(list.get(a).getAdress());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
seekBar.setMax(mediaPlayer.getDuration());
final Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
int currentPosition = mediaPlayer.getCurrentPosition();
seekBar.setProgress(currentPosition);
if(currentPosition==mediaPlayer.getDuration()){
timer.cancel();
Log.i(TAG, "run: 取消");
}
}
},0,1000);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private void method() {
contentResolver=getContentResolver();
uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor=contentResolver.query(uri,null,null,null,null);
while (cursor.moveToNext()){
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String time = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String address = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
list.add(new ServersMuctic(title,name,time,address));
}
myAdapter.notifyDataSetChanged();
}
@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){
Log.i(TAG, "onRequestPermissionsResult: 读取成功");
method();
}
}
public void privice(View view) {
a--;
if(a>=0){
sb(a);
}
}
public void stop(View view) {
mediaPlayer.pause();
}
public void next(View view) {
a++;
if(a<list.size()){
sb(a);
}
}
}
8 清单文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.servermusic">
<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/ic_launcher"
android:label="@string/app_name"
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>