简单实现音乐播放器,通过服务去操作播放器的上一首、下一首、播放和暂停
操作播放器的主要几种方法:
注册清单需要添加:
//服务注册
/*
注册SD卡的读与写
*/
访问音乐文件的URI:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
标签名:
//MediaStore.Audio.Media.TITLE歌名
//MediaStore.Audio.Media.DURATION总时长
//MediaStore.Audio.Media.DATA地址
<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=".Music_Activity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/rl"
>
ListView>
<RelativeLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
>
<ImageView
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/ic_media_play"
android:layout_centerHorizontal="true"
android:visibility="gone"
/>
<ImageView
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/ic_media_pause"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一首"
android:layout_alignParentRight="true"
/>
<Button
android:id="@+id/prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一首"
/>
RelativeLayout>
RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="@+id/mname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:text="歌名"
android:textSize="30sp"
/>
<TextView
android:id="@+id/mtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="30dp"
android:textSize="20sp"
android:text="时长"
/>
RelativeLayout>
package com.example.music_task;
import android.app.Service;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
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.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class Music_Activity extends AppCompatActivity {
static int index;
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver;
ArrayList<Music> musics;
ListView lv;
MyListViewAdapter adapter;
MusicService musicService;
Button next;
Button prev;
ImageView kaishi;
ImageView pause;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
musicService = ((MusicService.MyBinder)service).getMusicService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
//初始化
init();
Check();
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
index = position;
musicService.play(musics,position);
Toast.makeText(Music_Activity.this, musics.get(position).getName(), Toast.LENGTH_SHORT).show();
}
});
//下一首
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("mainindex###",index+"");
index+=1;
if(index < 3){
musicService.next(musics,index);
}else{
index = 0;
musicService.next(musics,index);
}
}
});
//上一首
prev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
index-=1;
if(index < 0){
index = 2;
musicService.next(musics,index);
}else{
musicService.prev(musics,index);
}
}
});
//开始监听
kaishi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
kaishi.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
musicService.pause_me();
}
});
//暂停监听
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
kaishi.setVisibility(View.VISIBLE);
pause.setVisibility(View.GONE);
musicService.pause_me();
}
});
}
/**
* 初始化
*/
public void init(){
//MediaStore.Audio.Media.TITLE歌名
//MediaStore.Audio.Media.DURATION总时长
//MediaStore.Audio.Media.DATA地址
lv = findViewById(R.id.lv);
next = findViewById(R.id.next);
prev = findViewById(R.id.prev);
kaishi = findViewById(R.id.start);
pause = findViewById(R.id.pause);
musics = new ArrayList<>();
resolver = getContentResolver();
String col[]={MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA};
Cursor query = resolver.query(uri, col, null, null, null);
while(query.moveToNext()){
String name = query.getString(query.getColumnIndex(col[0]));
String time = query.getString(query.getColumnIndex(col[1]));
String patn = query.getString(query.getColumnIndex(col[2]));
musics.add(new Music(name,patn,time));
}
//设置适配器
adapter = new MyListViewAdapter(musics,this);
lv.setAdapter(adapter);
//绑定服务
Intent intent = new Intent(Music_Activity.this, MusicService.class);
bindService(intent,connection, Service.BIND_AUTO_CREATE);
Log.e("###init","初始化完毕");
}
public void Check(){
/**
* 测试是否添加进集合
*/
for (Music m: musics) {
Log.e("music###",m.toString());
}
}
/**
* 服务解绑
*/
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
package com.example.music_task;
public class Music {
String name;
String path;
String time;
public Music(String name, String path, String time) {
this.name = name;
this.path = path;
this.time = time;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return "Music{" +
"name='" + name + '\'' +
", path='" + path + '\'' +
", time='" + time + '\'' +
'}';
}
}
package com.example.music_task;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
/**
* 服务类
*/
public class MusicService extends Service {
MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
public class MyBinder extends Binder{
public MusicService getMusicService(){
return MusicService.this;
}
}
//播放方法
public void play(ArrayList<Music> music,int index){
try {
if(player == null){
player = new MediaPlayer();
Log.e("path###",music.get(index).getPath());
player.setDataSource(music.get(index).getPath());
player.prepare();
player.start();
}else{
player.stop();
player.release();
player = null;
player = new MediaPlayer();
Log.e("path###",music.get(index).getPath());
player.setDataSource(music.get(index).getPath());
player.prepare();
player.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//暂停方法
public void pause_me(){
if(player.isPlaying()){
player.pause();
}else{
player.start();
}
}
//下一首
public void next(ArrayList<Music> music,int index){
if(player.isPlaying()){
if(index < 3){
player.stop();
player.release();
player = null;
Log.e("index###",index+"");
play(music,index);
}
}
}
//上一首
public void prev(ArrayList<Music> music,int index){
if(player.isPlaying()){
player.stop();
player.release();
player = null;
Log.e("index###",index+"");
play(music,index);
}
}
}
package com.example.music_task;
import android.content.ContentResolver;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyListViewAdapter extends BaseAdapter {
ArrayList<Music> music;
Context context;
public MyListViewAdapter(ArrayList<Music> music, Context context) {
this.music = music;
this.context = context;
}
@Override
public int getCount() {
return music.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder myHolder = null;
if(convertView == null){
convertView = View.inflate(context,R.layout.music_item,null);
myHolder = new MyHolder();
myHolder.mname = convertView.findViewById(R.id.mname);
myHolder.mtime = convertView.findViewById(R.id.mtime);
convertView.setTag(myHolder);
}else{
myHolder = (MyHolder)convertView.getTag();
}
if(myHolder != null){
myHolder.mname.setText(music.get(position).getName());
myHolder.mtime.setText(music.get(position).getTime());
}
return convertView;
}
public class MyHolder{
TextView mname;
TextView mtime;
}
}