模拟音乐器

2019-04-13 14:38发布

如何在listView中,能将手机中的音乐导入到其中

第一步:在自己的模块中的jAVA文件夹下,找到三个包,在第一个包中要创建三个包,首先创建出一个实体类的包,名称可以为entity;其次创建一个适配器的包,名称为Adapter;再然后创建碎片包,名称为Fragment.

这里写图片描述

第二步:在实体类中创建一个java.class文件,文件名为Music(注意首字母一定要大写);在这个文件中创建对象(如果使用private修饰,一定要用get与set方法)

这里写图片描述

第三步:在Layout文件夹下创建行布局XML文件(music_item),根据实体类中所写的对象进行布局`

android:id="@+id/item_play" android:layout_width="4dp" android:layout_height="80dp" android:background="@color/colorAccent" android:contentDescription="@null" android:visibility="invisible" /> "

第四步:在Adapter包中创建MusicAdapter类,要继承BaseAdapter,定义List<实体类名> musiclist,Context–创建构造方法,参数为(List<实体类名> musiclist,Context),然后修改getCount方法和getView方法,在getView方法中要利用缓存原理(ViewHolder类)

这里写图片描述 public int getCount() { return musicList.size(); } public View getView(int i, View view, ViewGroup viewGroup) { //缓存原理 View v = null; ViewHolder viewHolder; if (view == null) { LayoutInflater inflater = LayoutInflater.from(context); v = inflater.inflate(R.layout.item_music, null); viewHolder = new ViewHolder(); viewHolder.ablumbmp = v.findViewById(R.id.item_img1); viewHolder.artisttv = v.findViewById(R.id.item_text1); viewHolder.titletv = v.findViewById(R.id.item_text2); viewHolder.ablumtv = v.findViewById(R.id.item_text3); v.setTag(viewHolder); } else { v = view; viewHolder = (ViewHolder) v.getTag(); } //控件赋值 viewHolder.ablumbmp.setImageBitmap(musicList.get(i).getAblumbmp()); viewHolder.artisttv.setText(musicList.get(i).getArtist()); viewHolder.titletv.setText(musicList.get(i).getTitle()); viewHolder.ablumtv.setText(musicList.get(i).getAblum()); return v; } class ViewHolder { ImageView ablumbmp; TextView artisttv; TextView titletv; TextView ablumtv; }

第五步:在Fragment中创建两个Fragment–localFragment和onlinFragmnet

第六步:在Main布局文件中创建ViewPager

第七步:MainActivity中对ViewPager进行定义,绑定ID,还要建立一个数组,用来存放所要滑动的页面;在内部创建一个适配器的类(MyAdapter)要继承 FragmentPagerAdapter,并对这里面的构造方法内容进行修改,再将ViewPager绑定适配器(有注意点,请看图片)

这里写图片描述 这里写图片描述

第八步:将ListView格局写在localFragment.xml文件中,在localFragment.java对其定义,绑定ID,然后添加所要获取的内容,因为是从手机上获取所以需要下面所示代码

//获取 ContentResolver对象 ContentResolver resolver=getActivity().getContentResolver(); //创建游标 Cursor cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null); //游标归零 cursor.moveToFirst(); do { String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); String ablum=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); Music m=new Music(); m.title=title; m.artist=artist; m.ablum=ablum; musicList.add(m); }while (cursor.moveToNext()); cursor.close(); 注意点:获取文件时,需要权限,安卓版本6.0以下的手机,在manifests中加入
安卓版本6.0以上的则复杂一点,但使用第三方插件容易一点
印度人写的第三方插件(点击查看) https://github.com/pankaj89/PermissionHelper
build.gradle中编译 compile ‘com.master.android:permissionhelper:1.3’ //进行定义 private String TAG = "HelloActivity"; private PermissionHelper permissionHelper; //要写在onCreateView方法中 permissionHelper = new PermissionHelper(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); permissionHelper.request(new PermissionHelper.PermissionCallback() { @Override public void onPermissionGranted() { //全都授权 Log.e(TAG,"onPermissionGranted..."); } @Override public void onIndividualPermissionGranted(String[] grantedPermission) { //某个授权 Log.e(TAG,"onIndividualPermissionGranted() called with: grantedPermission = [" + TextUtils.join(",",grantedPermission) + "]"); } @Override public void onPermissionDenied() { //某个拒绝 Log.e(TAG,"onPermissionDenied..."); } @Override public void onPermissionDeniedBySystem() { //用户选择了"不再询问"后,点击"拒绝按钮",执行此方法 Log.e(TAG,"onPermissionDeniedBySystem..."); } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (permissionHelper != null) { permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults); } }

第九步:获取音乐的专辑图片 1.获取音频文件的ID 2.根据专辑ID继续获取专辑图片

在do中添加 //获取专辑ID int albumId = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); //根据专辑ID获取到专辑封面图 m.thumbBitmap = getAlbumArt(albumId); 在localFragment中输入以下代码,可以获取专辑图片,但为了减轻list的负担,可以在MusicAdapter中写 /** * 根据专辑ID获取专辑封面图 * @param album_id 专辑ID * @return */ private Bitmap getAlbumArt(int album_id) { String mUriAlbums = "content://media/external/audio/albums"; String[] projection = new String[]{"album_art"}; Cursor cur = context.getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null); String album_art = null; if (cur.getCount() > 0 && cur.getColumnCount() > 0) { cur.moveToNext(); album_art = cur.getString(0); } cur.close(); Bitmap bm = null; if (album_art != null) { bm = BitmapFactory.decodeFile(album_art); } else { bm = BitmapFactory.decodeResource(getResources(), R.drawable.default_cover); } return bm; }