您的位置:首页 > 移动开发 > Android开发

Android构造音乐播放器并实现获取本地音乐

2018-04-09 14:36 309 查看

1.思路介绍

step1:构造项目和包

新建一个project会自己创一个MainActivity,然后创3个包分别是adapter(适配器)、entity(实体)、fragment(碎片; 片段)。

step2:进行layout(界面)布局。

使用ListView布局

step3:在entity包中创建公共类

在entity中创一个Music(java class中创建),并定义5个公共类title、artist、album、length、albump。

step4:在adapter包中创建适配器

先创一个MusicAdapter(java class中创建),开始写适配器内容。

step5:在fragment包中创2个fragment(在与Activity一起的Fragment创建,切记)

创2个fragment,一个叫LocalFragment,另一个叫OnlineFragment。其中在LocalFragment中进行绑定适配器并填充数据。

step6:在MainActivity中添加监听并绑定LocalFragment的适配器,并进行读取数据。

当然构造音乐播放器并实现获取本地音乐,并不是这么简单。其中还要对Activity中的layout进行布局,主要是MainActivity、LocalFragment、OnlineFragment的布局。还有获取本地音乐的权限问题,以及如何插入本地音乐和如何使用游标,这些都是需要思考的。

2代码演示

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ssq.wanyiyu.fragment.LocalFragment">

<!-- TODO: Update blank fragment layout -->

<ListView
android:id="@+id/local_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</FrameLayout>


其中ListView是在LocalFragment进行布局的,这样就可以用MainActivity进行绑定,最好不在别处进行布局。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ssq.wanyiyu.fragment.OnlieFragment">

<!-- TODO: Update blank fragment layout -->

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Online"
android:textSize="30sp" />
</FrameLayout>


注意这个ListView是在OnlineFragment中的layout写的,主要的目的是让Activity能够左右滑动。

<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"
android:orientation="vertical"

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/main_local_tv"
android:textSize="20sp"
android:gravity="center"
android:text="本地音乐"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/main_online_tv"
android:textSize="20sp"
android:gravity="center"
android:text="在线音乐"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="50dp" />
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/main_vp"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

</LinearLayout>


这个是在MainActivity中的layout写的,主要作用是将2个TextView与两个滑动进行绑定,就是页面左右滑动的时候本地音乐在线音乐一直都在。其中ViewPager,它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

/**
* Created by OldLee on 2017/12/18.
*/

public class Music {
public String title;//歌名
public String artist;//歌手
public String album;//专辑
public int length;//时长
public Bitmap albumbmp;//专辑图片
}


这个是entity中Music(java class中创建)创的类主要是为了让adapter和fragment中适配器进行绑定。

/**
* Created by OldLee on 2017/12/18.
*/
//  改造适配器
public class MusicAdapter extends BaseAdapter {
private List<Music>musicList;
private Context context;
public MusicAdapter(List<Music>musicList,Context context){
this.context=context;
this.musicList=musicList;
}
@Override
public int getCount() {
return musicList.size();
}

@Override
public Object getItem(int i) {
return null;
}

@Override
public long getItemId(int i) {
return 0;
}

@Override
public View getView(int i, View view1, ViewGroup viewGroup) {
View view=null;
ViewHolder viewHolder=null;
if (view1==null){
view= LayoutInflater.from(context).inflate(R.layout.music_item,null);
viewHolder=new ViewHolder();
viewHolder.titletv=view.findViewById(R.id.music_item_title);
viewHolder.artisttv=view.findViewById(R.id.music_item_artist);
viewHolder.albumImageView=view.findViewById(R.id.music_item_bmp);

view.setTag(viewHolder);
}else {
view=view1;
viewHolder= (ViewHolder) view.getTag();
}
Music music=musicList.get(i);
viewHolder.titletv.setText(music.title);
viewHolder.artisttv.setText(music.artist+" - "+music.album);
viewHolder.albumImageView.setImageBitmap(music.albumbmp);
return view;
}
class ViewHolder{
TextView titletv;
TextView artisttv;
ImageView albumImageView;
}
}


这个是在MusicAdapter中打的,主要是为了配置适配器,并进行填充数据。

/**
* A simple {@link Fragment} subclass.
*/
public class LocalFragment extends Fragment {
private ListView localListView;
private List<Music>musicList=new ArrayList<>();

public LocalFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_local, container, false);
localListView=view.findViewById(R.id.local_listview);
intListview();
//获取ContentResolver对象
ContentResolver resolver=getContext().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 album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
int albumpID=cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

Music m=new Music();
m.albumbmp=getAlbumArt(albumpID);
m.album=album;
m.artist=artist;
m.title=title;
musicList.add(m);
}while (cursor.moveToNext());
cursor.close();
localListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent=new Intent(getActivity(), MusicActivity.class);
intent.putExtra("title",musicList.get(i).title);
intent.putExtra("artist",musicList.get(i).artist);
intent.putExtra("album",musicList.get(i).album);
getActivity().startActivity(intent);
}
});
return view;
}

private void intListview() {
musicList=new ArrayList<>();//变量初始化
//        Music m1=new Music();
//        m1.title="成都";
//        m1.artist="赵雷";
//        m1.album="成都";
//        Music m2=new Music();
//        m2.title="成都";
//        m2.artist="赵雷";
//        m2.album="成都";
//        musicList.add(m1);
//        musicList.add(m2);
MusicAdapter adapter=new MusicAdapter(musicList,getActivity());
localListView.setAdapter(adapter);
}
/**
* 根据专辑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 = getActivity().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.mipmap.default_cover);
}
return bm;
}
}


这个是在LocalFragment学的,当然OnlineFragment没写什么,这里就不把代码写出来了,这里的LocalFragment主要作用与MusicAdapter差不多,也是绑定适配器,并进行填充数据。

/**
* Created by OldLee on 2017/12/18.
*/

public class MusicPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public MusicPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.fragmentList=fragmentList;
}

@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}

@Override
public int getCount() {
return fragmentList.size();
}
}


这个是对MusicPager进行赋值,好让MainActivity进行绑定。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView localtv;
private  TextView onlinetv;
private ViewPager viewPager;
private List<Fragment>fragmentList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
//添加监听
localtv.setOnClickListener(this);
onlinetv.setOnClickListener(this);
LocalFragment localFragment=new LocalFragment();
OnlieFragment onlieFragment=new OnlieFragment();
fragmentList.add(localFragment);
fragmentList.add(onlieFragment);
//ViewPage绑定适配器
MusicPagerAdapter pagerAdapter=new MusicPagerAdapter(getSupportFragmentManager(),fragmentList);
viewPager.setAdapter(pagerAdapter);
}
//绑定ID
private void bindID() {
localtv=findViewById(R.id.main_local_tv);
onlinetv=findViewById(R.id.main_online_tv);
viewPager=findViewById(R.id.main_vp);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.main_local_tv:
break;
case R.id.main_online_tv:
break;
default:
break;
}
}
}


这个是MainActivity中写的,主要是讲绑定的适配器进行赋值。

3注意点

1.添加插件

在bulid.gradle,自己的写的模块在。

在最下面dependencies中加一个compile‘com.的插件

联网后手动下载

2.创建游标

创建游标course
//获取ContentResolver对象
ContentResolver resolver=getContext().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 album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
Music m=new Music();
m.album=album;
m.artist=artist;
m.title=title;
musicList.add(m);
}while (cursor.moveToNext());
cursor.close();//游标结束


3ListView创建:

1实体类。

2行布局。

3适配器。

4填充数据。

5绑定适配器。

4.安卓权限

6.0一下版本加下每一句话

6.0以上版本需要下载插件

5.根据专辑ID继续获取专辑封面图

/**
* 根据专辑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;
}


好了,我就知道这么多,其实有很多,但是我不怎么会讲,如果想学的话,还是要真的从头开始学,毕竟这个还是蛮难的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android java 音乐
相关文章推荐