此类作为数据库查询结果bean

public class MusicBean {    private String title;    private String singer;    private String path;    private long time;    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getSinger() {        return singer;    }    public void setSinger(String singer) {        this.singer = singer;    }    public String getPath() {        return path;    }    public void setPath(String path) {        this.path = path;    }    public long getTime() {        return time;    }    public void setTime(long time) {        this.time = time;    }}

此类用来查询数据库和时间转换

public class MusicUtil {    @RequiresApi(api = Build.VERSION_CODES.O)    static public ArrayList<MusicBean> getAllMusic(Context context) {        ArrayList<MusicBean> all = new ArrayList<>();        ContentResolver contentResolver = context.getContentResolver();//获取ContentResolver对象        //调用contentResolver对象的query方法查询系统表的音频文件数据        Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null);        //通过cursor取出查询数据存放在musicBean中        while (cursor.moveToNext()) {            MusicBean bean = new MusicBean();            bean.setTitle(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));            bean.setSinger(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));            bean.setPath(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));            bean.setTime(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)));            all.add(bean);        }        return all;    }    /*毫秒转化成分钟加秒*/    public static String formatTime(long time) {        String min = (time / (1000 * 60)) + "";//得到分钟        String second = (time % (1000 * 60) / 1000) + "";//得到秒        return min + "分" + second + "秒";    }}

此类是activity类,实现转化资源文件,动态申请权限,自定义ListView适配器,将bean中封装的数据更新到item中的数据项中显示出来

ublic class MainActivity extends AppCompatActivity {    ListView listView;    MediaPlayer mp;     //播放音频对象    ArrayList<MusicBean> data;    @RequiresApi(api = Build.VERSION_CODES.O)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = findViewById(R.id.lv);        mp = new MediaPlayer();        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {            data = MusicUtil.getAllMusic(this);            MyAdapter myAdapter = new MyAdapter();            listView.setAdapter(myAdapter);        } else {            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 101);        }        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                if (mp.isPlaying()) {                    mp.stop();                } else {                    mp.reset();                    try {                        mp.setDataSource(data.get(position).getPath());                        mp.prepare();                        mp.start();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        });    }/*权限申请结果回调方法*/    @RequiresApi(api = Build.VERSION_CODES.O)    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        if (requestCode == 101 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {            data = MusicUtil.getAllMusic(this);            MyAdapter myAdapter = new MyAdapter();            listView.setAdapter(myAdapter);        } else {            Toast.makeText(getApplicationContext(), "请授予权限否则无法使用", Toast.LENGTH_SHORT).show();        }        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }     /*自定义适配器*/    class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return data.size();        }        @Override        public Object getItem(int position) {            return position;        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null);            MusicBean bean = data.get(position);            TextView tv_title = view.findViewById(R.id.tv_title);            TextView tv_singer = view.findViewById(R.id.tv_singer);            TextView tv_time = view.findViewById(R.id.tv_time);            TextView tv_path = view.findViewById(R.id.tv_path);            tv_title.setText(bean.getTitle());            TextPaint tp = tv_title.getPaint();//中文字体加粗            tp.setFakeBoldText(true);            tv_singer.setText(bean.getSinger());            tv_time.setText(MusicUtil.formatTime(bean.getTime()));            tv_path.setText(bean.getPath());            if(position%2==0){ //改变背景颜色                view.setBackgroundResource(R.drawable.item);            }            return view;        }    }}

有一点要提一下,使用资源文件设置listView的背景颜色,在此分享给大家,在darwable资源目录下新建xml文件

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true" android:drawable="@color/colorAccent"></item>    <item android:state_pressed="false" android:drawable="@color/coloritem"></item></selector>

其中true表示未长按时,false表示长按选中时

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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/lv"        android:layout_width="match_parent"        android:layout_height="match_parent"/></LinearLayout>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="match_parent"><TextView    android:id="@+id/tv_title"    android:layout_width="0dp"    android:layout_height="40dp"    android:layout_weight="1"/>    <TextView        android:id="@+id/tv_singer"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"/>    <TextView        android:id="@+id/tv_path"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"/>    <TextView        android:id="@+id/tv_time"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"/></LinearLayout>

用contentResolver+ListView+mediaPlayer实现简单Android音乐播放器_第1张图片

更多相关文章

  1. android 根据Uri获取文件绝对路径
  2. 重命名sd卡中的文件名
  3. android用intent打开各种文件
  4. Android 判断是否得到 root权限
  5. No 98 · Android 下载文件及写入SD卡(摘)
  6. 【android开发】android操作文件
  7. android 播放Raw文件夹下的音乐文件
  8. android 权限库,拿来就能用
  9. 转:android 实现 流媒体 播放远程mp3文件 代码

随机推荐

  1. Android(安卓)file transfer/Upload
  2. android ant 打包报错:  [aapt] invalid
  3. Android(安卓)SDK和最新ADT下载地址 + 环
  4. android 权限汇集
  5. 全屏、小屏、横屏、竖屏的切换
  6. Android基于Google map V2地图开发基础
  7. android之应用程序退到android桌面的实现
  8. AndroidManifest.xml 中application 的 a
  9. Android键盘属性
  10. android studio 打包 so 库