<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.mediaplayer.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放本地资源文件"
android:onClick="playFromRes"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放系统文件"
android:onClick="playFromSys"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放网络文件"
android:id="@+id/button3"
android:onClick="playFromNet"
android:layout_below="@+id/button2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
package com.example.administrator.mediaplayer;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//播放本地资源文件
public void playFromRes(View view)
{
MediaPlayer mp=MediaPlayer.create(this,R.raw.mjx);
mp.start();
}
//播放系统文件
public void playFromSys(View view)
{
MediaPlayer mp=new MediaPlayer();
String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+"/xpg.mp3";
try {
//设置数据源
mp.setDataSource(this, Uri.parse(path));
mp.prepare();//同步执行
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void playFromNet(View view)
{
String path="http://music.baidutt.com/up/kwcywucc/awmkw.mp3";
MediaPlayer mp=new MediaPlayer();
try {
mp.setDataSource(this,Uri.parse(path));
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mp.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.mediaplayer.MainActivity2">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@mipmap/yinyue" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一首"
android:id="@+id/button_last"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一首"
android:id="@+id/button_next"
android:layout_alignTop="@+id/button_pause"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:id="@+id/button_play"
android:layout_alignTop="@+id/button_last"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"
android:id="@+id/button_pause"
android:layout_alignTop="@+id/button_play"
android:layout_toRightOf="@+id/button_play"
android:layout_toEndOf="@+id/button_play" />
</RelativeLayout>
MainActivity.java
package com.example.administrator.mediaplayer;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/*简单的播放器实现*/
public class MainActivity2 extends
AppCompatActivity implements View.OnClickListener,
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
MediaPlayer.OnCompletionListener {
private MediaPlayer mp;
private int index = 0;//表示当前要播放音乐的索引
private Button button_play;
private Button button_pause;
private Button button_last;
private Button button_next;
private boolean isPause = false;//true表示暂停状态,false表示重头开始播
private ArrayList<String> musicList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
initMusic();
mp = new MediaPlayer();
mp.setOnPreparedListener(this);
mp.setOnErrorListener(this);
mp.setOnCompletionListener(this);
}
private void initView() {
button_play = (Button) findViewById(R.id.button_play);
button_pause = (Button) findViewById(R.id.button_pause);
button_last = (Button) findViewById(R.id.button_last);
button_next = (Button) findViewById(R.id.button_next);
button_play.setOnClickListener(this);
button_pause.setOnClickListener(this);
button_last.setOnClickListener(this);
button_next.setOnClickListener(this);
}
private void initMusic() {
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
musicList.add(root + File.separator + "bjsq.mp3");
musicList.add(root + File.separator + "greenbird.mp3");
musicList.add(root + File.separator + "mjx.mp3");
musicList.add(root + File.separator + "xpg.mp3");
musicList.add(root + File.separator + "zzlfz.mp3");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_play:
play();
break;
case R.id.button_pause:
pause();
break;
case R.id.button_last:
last();
break;
case R.id.button_next:
next();
break;
default:
break;
}
}
//播放
private void play() {
if (isPause) {
mp.start();
isPause = false;
} else {
start();
}
}
//暂停
private void pause() {
if (mp.isPlaying()) {
mp.pause();
isPause = true;
}
}
//上一首
private void last() {
if (index - 1 >= 0) {
index--;
} else {
index = musicList.size() - 1;
}
start();
}
//下一首
private void next() {
if (index + 1 <= musicList.size() - 1) {
index++;
} else {
index = 0;
}
start();
}
/*重头开始播放音乐*/
private void start() {
if (index < musicList.size()) {
if (mp.isPlaying()) {
mp.stop();
}
mp.reset();//重置
String musicpath = musicList.get(index);
try {
mp.setDataSource(musicpath);
mp.prepareAsync();
isPause = false;
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mp != null) {
if (mp.isPlaying()) {
mp.stop();
}
mp.release();
}
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.reset();
return true;
}
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
}
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true"
android:process=":music">
<intent-filter >
<action android:name="com.example.ACTION_PLAY"></action>
<action android:name="com.example.ACTION_PAUSE"></action>
<action android:name="com.example.ACTION_EXIT"></action>
</intent-filter>
</service>
activity_main3.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.mediaplayer.MainActivity3">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放"
android:id="@+id/button4"
android:onClick="play"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停"
android:onClick="pause"
android:id="@+id/button5"
android:layout_below="@+id/button4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="EXIT"
android:onClick="exit"
android:id="@+id/button6"
android:layout_below="@+id/button5"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
MainActivity3.java
package com.example.administrator.mediaplayer;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity3 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
public void play(View view)
{
Intent intent=new Intent(MusicService.ACTION_PLAY);
startService(intent);
}
public void pause(View view)
{
Intent intent=new Intent(MusicService.ACTION_PAUSE);
startService(intent);
}
public void exit(View view)
{
Intent intent=new Intent(MusicService.ACTION_EXIT);
startService(intent);
}
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_BACK)
{
}
return super.onKeyDown(keyCode, event);
}*/
}
MusicService.java
package com.example.administrator.mediaplayer;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.IBinder;
import android.os.PowerManager;
import java.io.File;
import java.io.IOException;
public class MusicService extends Service implements MediaPlayer.OnPreparedListener {
public static final String ACTION_PLAY = "com.example.ACTION_PLAY";
public static final String ACTION_PAUSE = "com.example.ACTION_PAUSE";
public static final String ACTION_EXIT = "com.example.ACTION_EXIT";
private WifiManager.WifiLock lock;
private MediaPlayer mediaPlayer;
public MusicService() {
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
//保持CPU正常工作
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
//保持Wifi不被休眠
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
lock = wifiManager.createWifiLock("mylock");
lock.acquire();
mediaPlayer.setOnPreparedListener(this);
notification();
}
private void notification()
{
Notification.Builder builder=new Notification.Builder(this);
builder.setTicker("我的第一个音乐播放神器");
builder.setSmallIcon(R.mipmap.yinyue);
builder.setContentTitle("我的音乐神器");
builder.setContentInfo("正在播放...");
PendingIntent pi=PendingIntent.getActivity(this,0,new Intent(this,MainActivity3.class),PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pi);
NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification=builder.build();
startForeground(0,notification);
nm.notify(0,notification);
}
@Override
public void onDestroy() {
super.onDestroy();
lock.release();
stopForeground(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (ACTION_PLAY.equals(action)) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + "zzlfz.mp3");
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
} else if (ACTION_PAUSE.equals(action)) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
} else if (ACTION_EXIT.equals(action)) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
}
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true"
android:process=":music">
<intent-filter>
<action android:name="com.example.ACTION_PLAY" />
<action android:name="com.example.ACTION_PAUSE" />
<action android:name="com.example.ACTION_EXIT" />
<action android:name="com.example.ACTION_STOP" />
</intent-filter>
</service>
<receiver
android:name=".MusicIntentReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.media.AUDIO_BECOMING_NOISY"></action>
</intent-filter>
</receiver>
代码改成:
MusicService.java
package com.example.administrator.mediaplayer;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.IBinder;
import android.os.PowerManager;
import java.io.File;
import java.io.IOException;
public class MusicService extends Service implements MediaPlayer.OnPreparedListener, AudioManager.OnAudioFocusChangeListener {
public static final String ACTION_PLAY = "com.example.ACTION_PLAY";
public static final String ACTION_PAUSE = "com.example.ACTION_PAUSE";
public static final String ACTION_EXIT = "com.example.ACTION_EXIT";
public static final String ACTION_STOP = "com.example.ACTION_STOP";
private WifiManager.WifiLock lock;
private MediaPlayer mediaPlayer;
public MusicService() {
}
@Override
public void onCreate() {
super.onCreate();
//获取音频的焦点
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
}
private void initMediaPlayer() {
mediaPlayer = new MediaPlayer();
//保持CPU正常工作
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
//保持Wifi不被休眠
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
lock = wifiManager.createWifiLock("mylock");
lock.acquire();
mediaPlayer.setOnPreparedListener(this);
notification();
}
private void notification() {
Notification.Builder builder = new Notification.Builder(this);
builder.setTicker("我的第一个音乐播放神器");
builder.setSmallIcon(R.mipmap.yinyue);
builder.setContentTitle("我的音乐神器");
builder.setContentInfo("正在播放...");
PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity3.class), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pi);
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = builder.build();
startForeground(0, notification);
nm.notify(0, notification);
}
@Override
public void onDestroy() {
super.onDestroy();
lock.release();
stopForeground(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (ACTION_PLAY.equals(action)) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + "zzlfz.mp3");
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
} else if (ACTION_PAUSE.equals(action)) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
} else if (ACTION_EXIT.equals(action)) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
else if (ACTION_STOP.equals(action))
{
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange)
{
case AudioManager.AUDIOFOCUS_GAIN:
//已获取焦点
initMediaPlayer();
mediaPlayer.setVolume(1.0f,1.0f);
break;
case AudioManager.AUDIOFOCUS_LOSS:
//长期失去焦点
if (mediaPlayer!=null)
{
if (mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
mediaPlayer.release();
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//失去焦点,但很快会获取
if (mediaPlayer!=null)
{
if (mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
}
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
//失去焦点,允许你吧声音调低,低音量继续播放
if (mediaPlayer.isPlaying())
{
mediaPlayer.setVolume(0.1f,0.1f);
}
break;
}
}
}
MusicIntentReceiver.java
package com.example.administrator.mediaplayer;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MusicIntentReceiver extends BroadcastReceiver {
private static final String action="android.media.AUDIO_BECOMING_NOISY";
public MusicIntentReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(action))
{
Intent intent1=new Intent(MusicService.ACTION_STOP);
context.startService(intent1);
}
}
}
案例:
activity_main4.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.mediaplayer.MainActivity4">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询音乐列表"
android:onClick="queryMusic"
android:id="@+id/button7"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
MainAvtivity4.java
package com.example.administrator.mediaplayer;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity4 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
}
public void queryMusic(View view)
{
//用ContentResolver查询媒体
ContentResolver cr=getContentResolver();
Cursor c=cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);
if (c!=null)
{
while(c.moveToNext())
{
String url= c.getString(c.getColumnIndex(MediaStore.Audio.Media.DATA));
String songName= c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
String artist= c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String time= c.getString(c.getColumnIndex(MediaStore.Audio.Media.DURATION));
System.out.println("路径:"+url);
System.out.println("歌名:"+songName);
System.out.println("歌手:"+artist);
System.out.println("时间:"+time);
System.out.println("--------------------------");
}
}
}
}