最近因为项目需要,需要在一个App里内嵌一个简易音乐播放器,故学习了下音乐播放器的编写。现记录以下文档功日后查询,也希望能为需要这样功能的人提供一些微薄的帮助。
下面进入正题:
首先 先贴上一份我的音乐类的代码以便后续读者读代码方便。
package com.example.thinkpad.adas11;
/**
* Created by thinkpad on 2018/9/8.
*/
public class Music {
private String path;
private String name;
private int time;
private int coverId;
public int getCoverId() {
return coverId;
}
public void setCoverId(int coverId) {
this.coverId = coverId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
然后贴上我的布局文件的代码,以便读者能有一个大体布局印象。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start">
<TextView
android:id="@+id/musicName"
android:layout_marginTop="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:gravity="left"
android:textColor="@color/white"
android:textSize="30dp"
android:text="音乐名"/>
<LinearLayout
android:layout_marginTop="50dp"
android:layout_gravity="center_horizontal"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/leftButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/left_circle"
android:layout_marginRight="50dp"/>
<ImageButton
android:id="@+id/playButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/play_circle"
android:layout_marginRight="50dp"/>
<ImageButton
android:id="@+id/rightButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/right_circle"/>
</LinearLayout>
<ImageView
android:id="@+id/musicCover"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/testcover"
android:background="@color/black"
android:layout_marginTop="30dp"
android:layout_marginLeft="50dp"/>
<LinearLayout
android:layout_marginTop="30dp"
android:layout_gravity="bottom"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/scan"/>
<Button
android:id="@+id/order"
android:layout_marginLeft="120dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="顺序播放"
android:textColor="@color/white"
android:background="#8000"/>
</LinearLayout>
</LinearLayout>
然后贴上活动的代码:
package com.example.thinkpad.adas11;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.InputEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.bumptech.glide.Glide;
import com.example.thinkpad.adas11.Util.MyToast;
import com.example.thinkpad.adas11.Util.ScanMusicUtil;
import com.example.thinkpad.adas11.http.pictureHttpUtil;
import com.example.thinkpad.adas11.http.weatherHttpUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Text;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
import static java.lang.Thread.sleep;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView loc;
private int key=0;//播放键开关变量
private ImageButton music_playButton;
private ImageButton music_nextButton;
private ImageButton music_lastButton;
private ImageButton videoButton;
private ArrayList<Music> musicList;
private MediaPlayer mediaPlayer=new MediaPlayer();
private ImageView testCover;
private int musicNumber=0;//音乐指针,指向正在播放的音乐
private TextView MusicName;
private ImageButton scan;
private Button orderButton;
private int order=0;//切歌顺序变量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_player);
music_lastButton=(ImageButton)findViewById(R.id.leftButton) ;
music_nextButton=(ImageButton)findViewById(R.id.rightButton);
music_lastButton.setOnClickListener(this);
music_nextButton.setOnClickListener(this);
orderButton=(Button) findViewById(R.id.order);
orderButton.setOnClickListener(this);
scan=(ImageButton)findViewById(R.id.scan);
scan.setOnClickListener(this);
playMusic=(ImageButton)findViewById(R.id.playButton) ;
testCover=(ImageView)findViewById(R.id.musicCover);
MusicName=(TextView)findViewById(R.id.musicName);
playMusic.setOnClickListener(this);
//以下代码设置播放器监听
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//切歌顺序逻辑代码
switch (order){
case 0:
nextMusic();//顺序播放音乐
break;
case 1:
mediaPlayer.start();//单曲循环音乐
break;
case 2:
if(!(musicNumber==(musicList.size()-1))){
mediaPlayer.reset();
nextMusic();//如果当前不是最后一首音乐就直接切换下一首音乐
}else{
//如果当前是最后一首音乐就切换到列表首,播放第一首音乐
mediaPlayer.reset();
musicNumber=0;
InitMedia(musicList.get(0));
mediaPlayer.start();
}
break;
case 3:
mediaPlayer.reset();
int next=(int)(Math.random()*(musicList.size()-1));//随即切换音乐
InitMedia(musicList.get(next));
mediaPlayer.start();
break;
}
}
});
music_playButton=(ImageButton) findViewById(R.id.musictop);
//以下代码隐藏标题栏
ActionBar actionBar =getSupportActionBar();
if(actionBar!=null){
actionBar.hide();
}
music_playButton.setOnClickListener(this);
loc=(TextView)findViewById(R.id.location);
//以下为权限申请代码
List<String> permissionList=new ArrayList<>();//构建权限申请表,以下就是逐步申请权限
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!permissionList.isEmpty() ){
String [] permissions=permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
}else{
requestLocation();
}
try{//等待权限完全获取
sleep(1000);}
catch (Exception e){
e.printStackTrace();
}
musicList= ScanMusicUtil.scanMusic(this);
//获取上一次的播放数据
SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
musicNumber=pref.getInt("musicNumber",0);
order=pref.getInt("order",0);
Log.d("order",""+order);
switch (order-1){
case 0:
orderButton.setText("单曲循环");
break;
case 1:
orderButton.setText("循环列表");
break;
case 2:
orderButton.setText("随机播放");
break;
case 3:
orderButton.setText("顺序播放");
break;}
InitMedia(musicList.get(musicNumber));
}
private void InitMedia(Music music){
try {
mediaPlayer.setDataSource(music.getPath());
mediaPlayer.prepare();
}catch (Exception e){
e.printStackTrace();
}
MusicName.setText(music.getName());
//获取封面
String id=getAlbumArt(music.getCoverId());
if(id!=null){
Bitmap bm = null;
bm = BitmapFactory.decodeFile(id);
BitmapDrawable bmpDraw = new BitmapDrawable(bm);
testCover.setImageDrawable(bmpDraw);
}else{
testCover.setImageDrawable(getResources().getDrawable(R.drawable.localcover));
}
}
private String getAlbumArt(int album_id)//获取封面一个关键方法
{
String mUriAlbums = "content://media/external/audio/albums";
String[] projection = new String[] { "album_art" };
Cursor cur = this.getContentResolver().query( Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null);
String album_art = null;
if (cur.getCount() > 0 && cur.getColumnCount() > 0)
{ cur.moveToNext();
album_art = cur.getString(0);
}
cur.close();
return album_art;
}
public void onClick(View v){
switch (v.getId()) {
case R.id.musictop:
mDrawerLayout.openDrawer(Gravity.START);
break;
case R.id.playButton:
if (key == 0) {
playMusic.setBackground(getResources().getDrawable(R.drawable.pause_cirlce));
key = 1;
mediaPlayer.start();
} else {
playMusic.setBackground(getResources().getDrawable(R.drawable.play_circle));
mediaPlayer.pause();
key = 0;
}
break;
case R.id.rightButton:
nextMusic();
break;
case R.id.leftButton:
lastMusic();
break;
case R.id.scan:
mediaPlayer.stop();
mediaPlayer.reset();
musicList = ScanMusicUtil.scanMusic(this);
InitMedia(musicList.get(musicNumber));
playMusic.setBackground(getResources().getDrawable(R.drawable.play_circle));
key = 0;
break;
case R.id.order:
//切歌秩序改变 逻辑
orderSwitch(order);
break;
}
}
private void orderSwitch(int x){
//点击秩序按钮(文本)时,设置好本次点击之后的秩序,然后order++推向下一个秩序
switch (x){
case 0:
orderButton.setText("单曲循环");
order++;
break;
case 1:
orderButton.setText("循环列表");
order++;
break;
case 2:
orderButton.setText("随机播放");
order++;
break;
case 3:
orderButton.setText("顺序播放");
order=0;
break;}
}
private void nextMusic(){
if(musicList.size()-2>=musicNumber) {
musicNumber++;
if (musicList.get(musicNumber) != null) {
mediaPlayer.reset();
InitMedia(musicList.get(musicNumber));
playMusic.setBackground(getResources().getDrawable(R.drawable.pause_cirlce));
key = 1;
mediaPlayer.start();
}
}
}
private void lastMusic(){
if(musicNumber>0) {
musicNumber--;
if (musicList.get(musicNumber) != null) {
mediaPlayer.reset();
InitMedia(musicList.get(musicNumber));
playMusic.setBackground(getResources().getDrawable(R.drawable.pause_cirlce));
key = 1;
mediaPlayer.start();
}
}
}
private void requestLocation(){
initLocation();//初始化一些地图SDK配置
mLocationClient.start();
}
private void initLocation(){//初始化一些地图SDK配置
LocationClientOption option= new LocationClientOption();
option.setScanSpan(5000);
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setIsNeedAddress(true);
mLocationClient.setLocOption(option);
}
@Override
public void onStop(){
super.onStop();
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putInt("musicNumber",musicNumber);
editor.putInt("order",order);
editor.apply();
}
@Override
public void onDestroy(){//
mediaPlayer.release();
//储存播放数据
/* */
super.onDestroy();
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
switch(requestCode){
case 1:
if(grantResults.length>0){
for(int result:grantResults){
if(result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else{
Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
}
}