如何在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;
}