张萌&韩墨羽——内容提供者获得本地所有音频

本文介绍了如何在安卓平台上利用MediaPlayer类实现本地音乐播放。详细阐述了MediaPlayer的关键方法,包括设置数据源、获取播放位置、控制播放状态等,并提到了实体类、内容提供者、适配器和布局在实现过程中的作用。
摘要由CSDN通过智能技术生成
本地音乐播放器.

在这里插入图片描述

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值