使用MediaPlayer完成音樂播放器

MediaPlayer

常用方法:
void setDataSource(String path) :通過一個具體的路徑來設置MediaPlayer的數據源,path可以是本地的一個路徑,也可以是一個網絡路徑
int getCurrentPosition() 獲取當前播放的位置
int getAudioSessionId() 返回音頻的session ID
int getDuration() 得到文件的時間
boolean isLooping () 是否循環播放
boolean isPlaying() 是否正在播放
void pause () 暫停
void start () 開始
void stop () 停止
void prepare() 同步的方式裝載流媒體文件。
void prepareAsync() 異步的方式裝載流媒體文件。
void reset() 重置MediaPlayer至未初始化狀態。
void release () 回收流媒體資源。
void seekTo(int msec) 指定播放的位置(以毫秒爲單位的時間)
void setLooping(boolean looping) 設置是否單曲循環
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 網絡流媒體播放結束時回調
setOnErrorListener(MediaPlayer.OnErrorListener listener) 發生錯誤時回調 **
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):當裝載流媒體完畢的時候回調。

音樂播放器代碼

Music類

public class Music implements Serializable{
private String name;
private String singer;
private long duration;
private String data;

public Music(String name, String singer, long duration, String data) {
    this.name = name;
    this.singer = singer;
    this.duration = duration;
    this.data = data;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSinger() {
    return singer;
}

public void setSinger(String singer) {
    this.singer = singer;
}

public long getDuration() {
    return duration;
}

public void setDuration(long duration) {
    this.duration = duration;
}

public String getData() {
    return data;
}

public void setData(String data) {
    this.data = data;
}

}

MainActivity

public class MediaActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabLayout tabLayout;
private ArrayList list=new ArrayList<>();
private MyFragmentPagerAdapter myFragmentPagerAdapter;
//列出需要主動獲取的權限WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE讀寫SD卡權限
private String[] permissiones=new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_media);
    initView();//初始化佈局 ViewPager_TabLayout_Fragent
    checkPermission();//檢測這些權限是否已經申請過

}
@RequiresApi(api = Build.VERSION_CODES.M)
private void checkPermission(){
    int readCode = ActivityCompat.checkSelfPermission(this,permissiones[0]);
    int writeCode = ActivityCompat.checkSelfPermission(this,permissiones[1]);
    if (!(readCode== PackageManager.PERMISSION_GRANTED)||!(writeCode==PackageManager.PERMISSION_GRANTED)){//只要有一項沒有申請到
        //主動去申請權限
        requestPermissions(permissiones,100);//要動態申請的權限;100請求狀態碼->判斷哪次動態申請的
    }
}

//動態權限申請回調方法->獲取動態申請結果
//permissions->動態申請的權限
//grantResults->動態權限申請結果->若干結果中1個權限申請失敗->申請失敗
@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (100==requestCode){
        boolean flag = true;
        //遍歷請求結果數組->若有一個權限失敗->flag=false->本次申請失敗
        for (int code : grantResults){
            if (code!=PackageManager.PERMISSION_GRANTED) {
                flag = false;
                break;
            }
        }
        if (flag)
            Toast.makeText(this,"申請成功",Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(this,"申請失敗",Toast.LENGTH_SHORT).show();
    }
}

private void initView() {
    viewPager=findViewById(R.id.vp);
    tabLayout=findViewById(R.id.tab);
    list.add(new Fragment_one());
    list.add(new Fragment_two());
    myFragmentPagerAdapter=new MyFragmentPagerAdapter(getSupportFragmentManager(),list);
    viewPager.setAdapter(myFragmentPagerAdapter);
    tabLayout.setupWithViewPager(viewPager);
}

}

功能類

public class Fragment_one extends Fragment implements BaseRecyclerViewAdapter.OnItemClick {

private  ContentResolver contentResolver;//內容解析者
private Uri uri;//uri
private String[] strs;//要查詢到字段
private ArrayList<Music> list=new ArrayList<>();
private RecyclerView rv;
private BaseRecyclerViewAdapter<Music> adapter;//萬能適配器

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_one, null);
    rv=view.findViewById(R.id.music_rv);
    initdata();//獲取數據
    return view;
}

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
private void initdata() {
    contentResolver= getActivity().getContentResolver();//獲得解析者
    uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//確定Uri
    //TITLE:歌名 DATA:文件路徑 DURATION:總時長,毫秒值爲單位 ARTIST:歌手名稱
    strs=new String[]{MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST};
    Cursor cursor = contentResolver.query(uri, strs,null,null,null,null);
    while (cursor.moveToNext()){
        list.add(new Music(cursor.getString(0),cursor.getString(3),cursor.getLong(2),cursor.getString(1)));
    }
    //萬能適配
    adapter=new BaseRecyclerViewAdapter<Music>(R.layout.item_one,getActivity(),list) {
        @Override
        public void bind(BaseViewHolder holder, int position) {
            holder.setText(R.id.tv_singer,list.get(position).getSinger());
            holder.setText(R.id.tv_title,list.get(position).getName());
        }
    };
    rv.setAdapter(adapter);
    rv.setLayoutManager(new LinearLayoutManager(getContext()));
    adapter.setClick(this);//設置點擊事件
}
private MediaPlayer mediaPlayer;

@Override
public void ItemClick(int index) {
    Intent intent = new Intent(getActivity(),MusicActivity.class);
    intent.putExtra("music",list.get(index));
    startActivity(intent);
}

}
public class MusicActivity extends AppCompatActivity implements View.OnClickListener,SeekBar.OnSeekBarChangeListener {
private SeekBar seekBar;
private Button paly,pause,stop,pre,next;
private SingleMediaPlayer mediaPlayer;
private Music music;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
initView();
initData();

}

private void initData() {
    seekBar.setMax((int) music.getDuration());//設置進度條的最大值爲音樂的時長
    music = (Music) getIntent().getSerializableExtra("music");//音樂對象
    if(mediaPlayer==null){
        mediaPlayer=SingleMediaPlayer.getMediaPlayer();//單粒模式的mediaPlayer對象
    }
    try {
        mediaPlayer.reset();//重置數據
        mediaPlayer.setDataSource(music.getData());//設置新的數據源
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//設置準備播放音樂
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();//開始播放音樂
            }
        });

    } catch (IOException e) {
        e.printStackTrace();
    }

    //定時器更新進度條
    Timer timer=new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    seekBar.setProgress(mediaPlayer.getCurrentPosition());
                }
            });
        }
    },0,1000);

}


private void initView() {
    seekBar=findViewById(R.id.seekbar);
    paly=findViewById(R.id.play);
    pause=findViewById(R.id.pause);
    stop=findViewById(R.id.stop);
    pre=findViewById(R.id.pre);
    next=findViewById(R.id.next);
    paly.setOnClickListener(this);
    pause.setOnClickListener(this);
    stop.setOnClickListener(this);
    pre.setOnClickListener(this);
    next.setOnClickListener(this);
    seekBar.setOnSeekBarChangeListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.play:
            if(!mediaPlayer.isPlaying()){
                mediaPlayer.start();
            }
            break;
        case R.id.pause:
            if(mediaPlayer.isPlaying()){
                mediaPlayer.pause();
            }
            break;
        case R.id.pre:

            break;
        case R.id.next:

            break;
        case R.id.stop:
            mediaPlayer.stop();
            break;
    }
}

@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    if(b){//判斷是否來自用戶的拖動
        mediaPlayer.seekTo(i);
    }
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章