Android 简易音乐播放器

    最近因为项目需要,需要在一个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:
        }
    }
  
    }


}

猜你喜欢

转载自blog.csdn.net/qq_41105058/article/details/82813361