导读
1.简单实现
2.引入Service实现
3.AudioManager
4.音乐播放器案例实现
简单实现
从sdcard和网络获取播放源
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hala.mediaplayer">
<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>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
MainActivity.java
package com.hala.mediaplayer;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建MediaPlayer对象,此时处于idel对象
MediaPlayer player=new MediaPlayer();
// 重置,使得MediaPlayer重回idel状态
// player.reset();
try {
//2.设置播放源,此时处于Initialized状态
//可以是SDcard下面的文件,也可以是网络文件
player.setDataSource(Environment.getExternalStorageDirectory()+"/Have A Heart.mp3");
//player.setDataSource("http://192.168.10.148:8080/music/Victoria.mp3");
//3.进入prepare状态
player.prepare();
//4.start状态
player.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
从资源文件中获取资源
这里要创建一个raw型的资源文件夹,并放入资源
package com.hala.mediaplayer;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//参数二:播放源,存放于资源文件raw中
player = MediaPlayer.create(this, R.raw.victoria);
//通过create不再需要调用prepare方法了,因为create中已经包括了
//如果再调用,会引发错误
player.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
player.stop();
player.release();
}
}
引入Service实现
⚠️不要忘记相应权限
MyService.java
package com.hala.mediaplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Environment;
import android.os.IBinder;
import java.io.IOException;
public class MyService extends Service {
private MediaPlayer player;
public MyService() {
}
//这里与上例MainActivity中onCreate一致
@Override
public void onCreate() {
super.onCreate();
//1.创建MediaPlayer对象,此时处于idel对象
player = new MediaPlayer();
// 重置,使得MediaPlayer重回idel状态
// player.reset();
try {
//2.设置播放源,此时处于Initialized状态
//可以是SDcard下面的文件,也可以是网络文件
player.setDataSource(Environment.getExternalStorageDirectory()+"/Have A Heart.mp3");
// player.setDataSource("http://192.168.10.148:8080/music/Victoria.mp3");
//3.进入prepare状态
player.prepare();
//4.start状态
player.start();
} catch (IOException e) {
e.printStackTrace();
}
}
//重写这个方法的返回值为START_NOT_STICKY,原因是
//默认情况下,程序被杀死时service会再次onCreate,
//START_NOT_STICKY作用是让service不再onCreate
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
//作用为关闭service时音乐会停止
@Override
public void onDestroy() {
super.onDestroy();
player.stop();
player.release();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
MainActivity.java
package com.hala.mediaplayer;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//启动服务
startService(new Intent(this,MyService.class));
}
}
AudioManager
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hala.mediaplayer">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<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>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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.hala.mediaplayer.MainActivity"
android:gravity="center_vertical">
<Button
android:id="@+id/up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="up"
android:onClick="voiceControll"/>
<Button
android:id="@+id/down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="down"
android:onClick="voiceControll"/>
<Button
android:id="@+id/mute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="mute"
android:onClick="voiceControll"/>
<Button
android:id="@+id/unmute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="unmute"
android:onClick="voiceControll"/>
</LinearLayout>
MyService.java
package com.hala.mediaplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import java.io.IOException;
public class MyService extends Service {
private MediaPlayer player;
public MyService() {
}
//这里与上例MainActivity中onCreate一致
@Override
public void onCreate() {
super.onCreate();
//1.创建MediaPlayer对象,此时处于idel对象
player = new MediaPlayer();
// 重置,使得MediaPlayer重回idel状态
// player.reset();
try {
//2.设置播放源,此时处于Initialized状态
//可以是SDcard下面的文件,也可以是网络文件
player.setDataSource(String.valueOf(getExternalFilesDir(Environment.DIRECTORY_MUSIC))+"/heart.mp3");
// player.setDataSource("http://bd.kuwo.cn/yinyue/512985?from=baidu");
//3.进入prepare状态
player.prepare();
//4.start状态
player.start();
} catch (IOException e) {
e.printStackTrace();
}
}
//重写这个方法的返回值为START_NOT_STICKY,原因是
//默认情况下,程序被杀死时service会再次onCreate,
//START_NOT_STICKY作用是让service不再onCreate
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
//作用为关闭service时音乐会停止
@Override
public void onDestroy() {
super.onDestroy();
player.stop();
player.release();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
MainActivity.java
package com.hala.mediaplayer;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//启动服务
startService(new Intent(this,MyService.class));
}
public void voiceControll(View view){
//1.获取声音管理器
AudioManager manager= (AudioManager) getSystemService(Service.AUDIO_SERVICE);
//2.操作
switch (view.getId()){
//增大
case R.id.up:
//参数1:声音类型
// AudioManager.STREAM_ALARM 警报闹钟
// AudioManager.STREAM_MUSIC 媒体
// AudioManager.STREAM_NOTIFICATION 通知
// AudioManager.STREAM_RING 铃声
// AudioManager.STREAM_VOICE_CALL 通话
// AudioManager.STREAM_SYSTEM 系统
//参数2:调整声音变化方向 变大/变小/不变
// AudioManager.ADJUST_RAISE
// AudioManager.ADJUST_LOWER
// AudioManager.ADJUST_SAME
//参数3:按键时出现的动作
// FLAG_PLAY_SOUND 发出声音 FLAG_SHOW_UI 显示音量进度条 0什么也没有
manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);
break;
//减小
case R.id.down:
manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_PLAY_SOUND);
break;
//静音
case R.id.mute:
//如果API>=23 手机版本>6.0
//如果手机版本过低会报错 IlleagalArguementException:Bad deriction -100
manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_MUTE,AudioManager.FLAG_SHOW_UI);
//如果API<23 手机版本<6.0
// manager.setStreamMute(AudioManager.STREAM_MUSIC,true);
break;
//还原静音
case R.id.unmute:
manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_UNMUTE,AudioManager.FLAG_SHOW_UI);
break;
}
}
}
音乐播放器案例实现
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hala.mediaplayer">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<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"></activity>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
<activity android:name=".MusicActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true"></service>
</application>
</manifest>
activity_music.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.hala.mediaplayer.MusicActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="▶"
android:id="@+id/playpause"
android:onClick="controll"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="■"
android:id="@+id/stop"
android:onClick="controll"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="◁"
android:id="@+id/last"
android:onClick="controll"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="▷"
android:id="@+id/next"
android:onClick="controll"/>
</LinearLayout>
<ProgressBar
android:id="@+id/music_pro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:layout_margin="5dp"/>
<ListView
android:id="@+id/music_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
MusicService.java
package com.hala.mediaplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import java.io.IOException;
public class MusicService extends Service {
public MusicService() {
}
MediaPlayer player;
@Override
public void onCreate() {
super.onCreate();
player = new MediaPlayer();
new Thread() {
@Override
public void run() {
super.run();
while (true) {
try {
sleep(200);
//如果player被释放掉,这个进度线程也就没必要进行了
if (player != null) {
MusicActivity.musicPro.setProgress(player.getCurrentPosition());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
int isStarting = -1;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String tag = intent.getStringExtra("tag");
if (tag.equals("play")) {
int index = intent.getIntExtra("index", 0);
play(index);
isStarting = 1;
} else if (tag.equals("pause")) {
player.pause();
isStarting = 1;
} else if (tag.equals("start")) {
if (isStarting == -1) {
play(0);
} else {
player.start();
}
}
return START_NOT_STICKY;
}
public void play(int index) {
String path = MusicActivity.pathList.get(index);
try {
//如果音乐正在播放,先停止
if (player.isPlaying()) {
player.stop();
}
player.reset();
player.setDataSource(path);
player.prepare();
player.start();
//获取歌曲进度条
MusicActivity.musicPro.setMax(player.getDuration());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
player.stop();
player.release();
isStarting = -1;
player = null;
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
MusicActivity.java
package com.hala.mediaplayer;
import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import java.io.File;
import java.util.ArrayList;
public class MusicActivity extends AppCompatActivity {
private ListView musicView;
//存放所有音乐曲目的名字
private ArrayList<String> nameList=new ArrayList<>();
//存放歌曲的路径,要被Service调用,所以是public static
public static ArrayList<String> pathList=new ArrayList<>();
private int index=0;//当前播放的曲目
private Button playpause;
public static ProgressBar musicPro;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
playpause=(Button)findViewById(R.id.playpause);
musicPro=(ProgressBar)findViewById(R.id.music_pro);
getMusic("/netease/cloudmusic/Music");
musicView=(ListView)findViewById(R.id.music_view);
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,nameList);
musicView.setAdapter(adapter);
musicView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent it=new Intent(MusicActivity.this,MusicService.class);
it.putExtra("index",i);
it.putExtra("tag","play");
startService(it);
index=i;
playpause.setText("||");
}
});
}
public void controll(View view){
switch (view.getId()){
case R.id.playpause:
Intent it1 = new Intent(MusicActivity.this,MusicService.class);
if(playpause.getText().equals("▶")){
it1.putExtra("tag","start");
playpause.setText("||");
}else {
it1.putExtra("tag","pause");
playpause.setText("▶");
}
startService(it1);
break;
case R.id.stop:
Intent it2=new Intent(MusicActivity.this,MusicService.class);
stopService(it2);
playpause.setText("▶");
break;
case R.id.last:
//如果是第一首,跳到最后一首
if(index==0){
index=pathList.size()-1;
}else{
index--;
}
Intent it3=new Intent(MusicActivity.this,MusicService.class);
it3.putExtra("index",index);
it3.putExtra("tag","play");
startService(it3);
playpause.setText("||");
break;
case R.id.next:
//如果是最后一首,跳到第一首
if(index==pathList.size()-1){
index=0;
}else{
index++;
}
Intent it4=new Intent(MusicActivity.this,MusicService.class);
it4.putExtra("index",index);
it4.putExtra("tag","play");
startService(it4);
playpause.setText("||");
break;
}
}
public void getMusic(String path){
path=Environment.getExternalStorageDirectory()+path;
File f=new File(path);
//获取该文件夹下的所有文件集合
File[] fs=f.listFiles();
for(int i=0;i<fs.length;i++){
String name=fs[i].getName();
//获取其后缀看他是否为mp3
String suffix=name.substring(name.length()-3,name.length());
if(suffix.equalsIgnoreCase("mp3")){
nameList.add(name);
pathList.add(fs[i].getAbsolutePath());
}
}
}
}