內容提供者獲得本地所有音頻
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>