Andriod studio學習 之 使用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)當裝載流媒體完畢的時候回調。

注意:reset方法是將數據清空。 release方法是將媒體對象回收掉

Song實體類

package com.example.day0017;

public class Song {
    private String title;
    private String artist;
    private int duration;
    private String data;

    public Song(String title, String artist, int duration, String data) {
        this.title = title;
        this.artist = artist;
        this.duration = duration;
        this.data = data;
    }

    public Song() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public int getDuration() {
        return duration;
    }

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

    public String getData() {
        return data;
    }

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

內容提供者

package com.example.day0017;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.util.ArrayList;
import java.util.List;

public class Myprovider {
    private Context context;
    private List<Song> list;

    public Myprovider(Context context, List<Song> list) {
        this.context = context;
        this.list = list;
    }
    public static List<Song> init(Context context){
        List<Song> list = new ArrayList<>();
        Uri uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String[] string={MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA};
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(uri, string, null, null, null);
        while (cursor.moveToNext()){
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            int duration = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            Song song = new Song(title, artist, duration, data);
            list.add(song);
        }
        cursor.close();
        return list;
    }

}

適配器

package com.example.day0017;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class Myadpater extends BaseAdapter {
    private Context context;
    private ArrayList<Song> list;

    public Myadpater(Context context, List<Song> list) {
        this.context = context;
        this.list = (ArrayList<Song>) list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView==null){
            convertView = LayoutInflater.from(context).inflate(R.layout.layout, null);
            viewHolder=new ViewHolder();
            viewHolder.title = convertView.findViewById(R.id.titleid);
            viewHolder.artist = convertView.findViewById(R.id.artistid);
            viewHolder.duration = convertView.findViewById(R.id.durationid);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.title.setText(list.get(position).getTitle());
        viewHolder.artist.setText(list.get(position).getArtist());
        int time = list.get(position).getDuration();
        String s = formatTime(time);
        viewholder.duration.setText(s);
        return convertView;
    }
    class ViewHolder{
        TextView title;
        TextView artist;
        TextView duration;
    }
    //音頻時長轉化爲分鐘:秒鐘
    public static String formatTime(int time) {
    if (time / 1000 % 60 < 10) {
        return time / 1000 / 60 + ":0" + time / 1000 % 60;
    } else {
        return time / 1000 / 60 + ":" + time / 1000 % 60;
    }
	 }
}

適配器佈局

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:layout_weight="1"
        android:layout_width="0dp"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/titleid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是歌名"
            android:layout_margin="10dp"
            />
        <TextView
            android:id="@+id/artistid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是歌手"
            android:layout_margin="10dp"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_gravity="center"
        android:layout_weight="0.5"
        android:layout_width="0dp"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/durationid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是時長"
            android:layout_margin="20dp"
            />
    </LinearLayout>

</LinearLayout>

activity類

   package com.example.day0017;

import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
    private ListView listid;
    private List<Song> list;
    private Myprovider myprovider;
    private Myadpater myadpater;
    private static final String TAG = "MainActivity";
    private Button stopid;
    private Button continueid;
    private Button backid;
    private Button nextid;
    private MediaPlayer mediaPlayer;
    private int num=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        

        listid = (ListView) findViewById(R.id.listid);

         myprovider = new Myprovider(this,list);

        stopid = (Button) findViewById(R.id.stopid);
        continueid = (Button) findViewById(R.id.continueid);
        backid = (Button) findViewById(R.id.backid);
        nextid = (Button) findViewById(R.id.nextid);

        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},101);
        }

        listid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.i(TAG, "onItemClick: "+position);
                try {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    num=position;
                    if (mediaPlayer!=null){
                        mediaPlayer.setDataSource(list.get(position).getData());
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();
                                updataseekbar();
                            }
                        });
                    }else {
                        mediaPlayer.setDataSource(list.get(num).getData());
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();
                                updataseekbar();
                            }
                        });
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        stopid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
            }
        });
        continueid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.start();
                updataseekbar();
            }
        });
        backid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (num!=0){
                    num-=1;
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    try {
                        mediaPlayer.setDataSource(list.get(num).getData());
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();

                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else {
                    Toast.makeText(MainActivity.this, "已經是第一首", Toast.LENGTH_SHORT).show();
                }
            }
        });
        nextid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (num!=list.size()-1){
                    num+=1;
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    try {
                        mediaPlayer.setDataSource(list.get(num).getData());
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();
                                

                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else {
                    Toast.makeText(MainActivity.this, "已經是最後一首", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
    private void updataseekbar(){
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                int currentPosition = mediaPlayer.getCurrentPosition();
                if (currentPosition==mediaPlayer.getDuration()){
                    timer.cancel();
                }
            }
        },0,1000);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode==101&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
            list = myprovider.init(this);
            Log.i(TAG, "onRequestPermissionsResult: "+list.size());
            myadpater =new Myadpater(this,list);
            listid.setAdapter(myadpater);
            mediaPlayer = new MediaPlayer();
        }
    }
}

activity中xml佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/listid"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
    <LinearLayout
        android:gravity="center"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <LinearLayout
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <Button
                android:id="@+id/stopid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="暫停播放"
                />
            <Button
                android:id="@+id/continueid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="繼續播放"
                />
            <Button
                android:id="@+id/backid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="上一首"
                />
            <Button
                android:id="@+id/nextid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="下一首"
                />
        </LinearLayout>

    </LinearLayout>

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