模拟音乐器

如何在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" />


<ImageView
    android:id="@+id/item_img1"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_margin="10dp"
    android:layout_marginRight="5dp"
    android:src="@mipmap/bg1" />

<TextView
    android:id="@+id/item_text1"
    android:layout_width="100dp"
    android:layout_height="30dp"
    android:layout_marginTop="10dp"
    android:layout_toRightOf="@id/item_img1"
    android:text="泰勒斯威夫特" />

<TextView
    android:id="@+id/item_text2"
    android:layout_width="60dp"
    android:layout_height="30dp"
    android:layout_below="@id/item_text1"
    android:layout_toRightOf="@id/item_img1"
    android:text="hoalou" />

<TextView
    android:id="@+id/item_text3"
    android:layout_width="100dp"
    android:layout_height="30dp"
    android:layout_below="@id/item_text1"
    android:layout_toRightOf="@id/item_text2"
    android:text="专辑"

    />

<TextView
    android:id="@+id/item_text4"
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:layout_alignParentRight="true"
    android:layout_marginTop="10dp"
    android:text="04:28" />

<View
    android:id="@+id/item_view"
    style="@style/AppTheme.Divider"
    android:layout_width="wrap_content"
    android:layout_height="1dp"
    android:background="#666666"
   android:layout_alignParentBottom="true"
    android:layout_alignBottom="@id/item_img1"/>"
第四步:在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中加入<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
安卓版本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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值